【问题标题】:Python izip memory error with izip.count()Python izip 内存错误与 izip.count()
【发布时间】:2014-06-19 01:35:32
【问题描述】:

我运行了以下代码:

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


    【解决方案1】:

    是的,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 已经是可迭代的,因为它是一个列表。

    【讨论】:

      【解决方案2】:

      为什么不只是这个?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        • 2013-12-04
        • 2012-10-31
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多