Python:内存管理优化不一致?

时间:2014-06-24 21:53:44

标签: python python-2.7 memory-management python-3.x

我对Python对象非常困惑'内存中的分配。似乎预定义类型的分配并不是一致的。以下是我对这个问题的思考的产物:

a = None
b = None
print( a, b is a) # it outputs True, one single instance of None

a = 'a'
b = 'a'
print( a, b is a) # it outputs True, one single instance of a string

a = 2
b = 2
print( a, b is a) # it outputs True, one single instance of an int


a = 2.5
b = 2.5
print( a, b is a) # it outputs True, one single instance of a float
                  # from the python command line  'b is a' returns False

a = 'a b'
b = 'a b'
print( a, b is a) # it outputs True, one single instances of the same string
                  # from the python command line  'b is a' returns False

a = ()
b = ()
print( a, b is a) # it outputs True, one single instance of a ()

a = {}
b = {}
print( a, b is a) # it outputs False, two different instances of the same empty {}

a = []
b = []
print( a, b is a) # it outputs False, two different instances of the same []

ida的{​​{1}}返回值表明b运算符正常运行但内存使用优化'算法似乎工作不一致。

最后两个is输出和python命令行解释器行为是否暴露了某些实现错误,或者Python是否应该以这种方式运行?

我在OpenSUSE 13.1环境中运行了这些测试。使用Python 2.7.6和Python 3.3.5(默认情况下, 2014年3月27日,17:16:46)[GCC] on linux。

除了命令行和程序之间的输出差异外,这种优化的原因是什么?我认为假设程序平均可以节省10%以上的内存是非常乐观的,除非我们考虑应该由程序员直接管理的特殊情况。

此行为是否有助于有效减少内存碎片?

1 个答案:

答案 0 :(得分:2)

这里的区别仅在于其中一些对象是可变的,有些是不可变的。

将分配优化到例如,是完全安全的。字符串文字,因为对同一个不可变对象的两次引用不会引起任何问题。由于您无法就地更改对象,因此任何更改都将表示与旧对象分开的新对象。

但是,对于像列表这样的可变类型,如果设置a = b,可能会遇到麻烦。可变对象可以就地更改,因此在列表示例中,您添加到a的任何内容都会以b结尾,反之亦然。

解释器中的行为是不同的(除了小的整数,这是“实习”),因为这些优化没有被执行:

>>> a = "a b"
>>> b = "a b"
>>> a is b
False