Python迭代器内存错误
我运行这个程序是为了创建迭代器,但在它开始打印任何内容之前,我就遇到了内存错误Python迭代器内存错误,python,Python,我运行这个程序是为了创建迭代器,但在它开始打印任何内容之前,我就遇到了内存错误 def test(): for x in range(10000000000000): yield x for x in test(): print 'hi' 输出: tutorial@p1980:~/tej$ python itertest.py Traceback (most recent call last): File "itertest
def test():
for x in range(10000000000000):
yield x
for x in test():
print 'hi'
输出:
tutorial@p1980:~/tej$ python itertest.py
Traceback (most recent call last):
File "itertest.py", line 7, in <module>
for x in test():
File "itertest.py", line 4, in test
for x in range(10000000000000):
MemoryError
tutorial@p1980:~/tej$python itertest.py
回溯(最近一次呼叫最后一次):
文件“itertest.py”,第7行,在
对于测试()中的x:
测试中第4行的文件“itertest.py”
对于范围内的x(100000000000):
记忆者
您似乎正在使用Python 2。在这种情况下,请使用xrange()
而不是range()
。xrange()
函数返回一个像迭代器而不是列表一样工作的对象
在Python 3中,
range()
返回一个像迭代器一样工作的对象,并且不提供xrange()
函数。您的问题是什么<代码>范围(100000000000)创建了一个相当大的列表。如果我只运行x=range(100000000000)
,进程在死亡前会使用高达56GB的内存。@Shashank:区别在于语义。Python2实际上返回一个“xrange对象”,出于上述目的,它在功能上与迭代器相同。无论如何,我已经编辑了答案。在Python3中,有一些非常有用的优化。除此之外,Python3允许您仅使用print(*test(),sep='\n')
打印生成器。不过,最好说它返回一个iterable对象。即使您知道它并不完全返回迭代器,也最好避免将其他人与该术语混淆。Python甚至有一个特定的错误:next(xrange(10))
(或Python 3.x中的range)产生:TypeError:xrange对象不是迭代器
@shashashank:我已经更新了答案,以避免产生误导性的术语。我觉得进一步解释Python内部实现的细节会影响答案。如果需要进一步的细节,读者可以参考这些评论。