我想这对你的 RAM 来说太多了。如果可能,您应该真正在一个 for 循环中执行操作,并优化您的迭代以提高内存效率。
fp.readlines()
呃,它一次读入文件的所有行,因此它的所有内容都在内存中。我不知道细节,将文件内容转换为字典的方式。但是如果它依赖于文件中的行,您可以简单地迭代文件,每个迭代步骤都会产生一个新行。
for line in fp:
# ...
但是,如果您再次将文件中的所有信息存储在字典中,您将再次面临同样的问题。
通过检查(如果可能)重复来优化存储在内存中的数据是 CPU 密集型的,但可能需要降低内存使用率。
在这两个片段执行相同的操作之后,一致性存储和生成器之间的区别应该很明显,但前者比后者更占用内存。请注意,这iterate_to
是该函数的完全副本,range/xrange
仅用于演示目的。
def iterate_to(num):
list_ = []
for i in xrange(num):
list_.append(i)
return list_
def operate_on(num):
list_ = []
for i in iterate_to(num):
x = (i ** i + 5) / (i * 2)
list_.append(x)
return list_
print sum(operate_on(1000000))
虽然该sum
函数对由 返回的列表中的每个元素求和,但每个1000000 个条目(!!) 的operate_on
两个列表在内存中是一致的。您可能已经认为它可以提高内存效率。
def iterate_to(num):
for i in xrange(num):
yield i
def operate_on(num):
for i in iterate_to(num):
x = (i ** i + 5) / (i * 2)
yield x
print sum(operate_on(1000000))
在此示例中,表达式yield
用于使 theiterate_to
和operate_on
函数都成为生成器函数。在迭代时,每个迭代步骤,直接计算迭代的下一个元素,而不是依赖于先前构造的项目集合。
更多关于发电机在这里。