使用izip.count()的Python izip内存错误

时间:2014-06-19 01:35:33

标签: python out-of-memory itertools izip

我运行了以下代码:

import itertools
my_list = ['a', 'b', 'c', 'd', 'e']
for i in itertools.izip([x for x in my_list], [y for y in itertools.count()]):
        print i

基于documentation for izip,我希望它返回一系列元组,在my_list用尽时结束:(a,0)(b,1)(c,2)(d, 3)(e,4)

相反,我得到下面复制的内存错误。似乎itertools.count()函数返回的是无限数据,而不是仅限于my_list中的5条记录?

line 50, in main
    for i in itertools.izip([x for x in range(10)], [y for y in itertools.count()]): MemoryError

2 个答案:

答案 0 :(得分:4)

是的,itertools.count旨在永不停止计算。这就是为什么它会返回一个iterator,它会按需生成项目,而不是一次生成所有项目。

但是,这部分代码:

[y for y in itertools.count()]

有效地告诉Python将itertools.count生成的无限数量的数字放入单个列表中。因此,引发MemoryError,因为此操作会立即占用所有可用内存。


您只需删除列表解析 1

即可解决问题
>>> import itertools
>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> for i in itertools.izip(my_list, itertools.count()):
...     print i
...
('a', 0)
('b', 1)
('c', 2)
('d', 3)
('e', 4)
>>>

通过此更改,itertools.izip将遍历itertools.count()返回的迭代器,现在只生成所需数量的数字。


1 我也删除了你的其他列表理解,因为它是不必要的:my_list已经是可迭代的,因为它是一个列表。

答案 1 :(得分:0)

为什么不呢?

for a,b in enumerate(my_list):
    print (b, a)