python 2.7中的不可变类型的内存不足

时间:2015-08-21 16:32:07

标签: python python-2.7

如果我每次在下面的循环中检查id(A),我会看到它的不同(可能是由于不变性)。如果是,如果长时间运行包含赋值的循环,是否有可能内存不足?或者是一个更好的主意  del A在任何新任务之前?

A = 10
for count in range(1,<a very high number>):
    A = count

2 个答案:

答案 0 :(得分:1)

在python2.7上range返回一个列表。我会更担心这个列表会导致你的内存问题。

如果你有一个长时间运行的函数,你只需要del一个变量,并且你有一个非常大对象,你希望尽快释放它。你将永远不会有一个接近那么大的整数。例如,仅仅十个字节就足以存储一个大于可观察宇宙中原子数的整数。

如果分配给变量,那么如果前一个对象只有一个引用,那么它将自动被释放。例如

import weakref # module that doesn't keep objects in memory if it has the only reference

class A(object):
    pass

a = A()
r = weakref.ref(a)
print(a is r())
a = 1
print(r() is None)

答案 1 :(得分:0)

在python 2.7中,range()函数生成一个int列表,并且(当然)将它全部存储在内存中,如果你有一个非常大的列表,理论上你可以用尽内存(尽管它应该非常大)。您应该使用xrange()而不是生成迭代器,因此您在内存中一次只有一个int

在python 3中,默认情况下使用迭代器循环所有迭代,因此range()函数的行为与python 2.7中的xrange()完全相同

相关问题