这个简单的陈述:
zip(xrange(0, 11614321), xrange(0, 11627964))
...吃掉了我的大部分内存。 (> 150 MiB!)为什么?
编辑:啊,重新阅读文档,我看到zip
会返回一个列表,而不是一个可迭代的列表。像zip
那样返回可迭代的东西吗?
更大的图片:我正在迭代两个大的文件数据数组,我正在做迭代(0端,0端),(0端,1端)等等。我想不对数组进行切片,因为它会导致过多的内存分配。我想我只是迭代索引,但这似乎不起作用,如上所述。整个代码:
def subsequence_length(data_a, data_b, loc_a, loc_b):
length = 0
for i_a, i_b in zip(xrange(loc_a, len(data_a)), xrange(loc_b, len(data_b))):
if data_a[i_a] == data_b[i_b]:
length += 1
else:
break
return length
答案 0 :(得分:12)
使用itertools中的izip
答案 1 :(得分:3)
如果由于某种原因你不想使用itertools
模块,那么编写自己的迭代器就可以做同样的事情,至少如果你知道你正在处理两个输入那么迭代器。
def xzip2(i1, i2):
i1, i2 = iter(i1), iter(i2)
while True:
yield next(i1), next(i2)
实际上,经过进一步反思,使其与任意数量的迭代器一起工作并不困难。我相当肯定itertools.izip
必须实现这样的东西。
def xzip(*iters):
iters = [iter(i) for i in iters]
while True:
yield tuple([next(i) for i in iters])
(看the documentation,我看到了,除非他们使用的是map
而不是列表推导。)