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

问题描述 投票:0回答:2

我运行了以下代码:

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
python out-of-memory itertools izip
2个回答
4
投票

是的,itertools.count旨在永不停止计数。这就是为什么它返回一个iterator,它按需生成物品而不是一次生成物品。

但是,这部分代码:

[y for y in itertools.count()]

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


您只需删除列表comprehension1即可解决问题:

>>> 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()返回的迭代器,现在只生成所需数量的数字。


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


0
投票

为什么不呢?

for a,b in enumerate(my_list):
    print (b, a)
© www.soinside.com 2019 - 2024. All rights reserved.