Wil*_*sem 1 python memory tuples python-internals
我想让我的代码更有效(内存).现在我们有很多函数将iterable作为参数,如:
def foo(para,meter,iterable):
#...
pass
Run Code Online (Sandbox Code Playgroud)
有时我们必须提供一个空列表来正常工作:foo(14,25,[]).问题是每次构造一个新列表时:它需要在堆上进行分配,并且列表似乎是64字节的内存(在我自己的机器上,经过测试sys.getsizeof([])),而空元组只需要一个(可能是一次) 48个字节.
因此我想知道空元组是否是一个常数.由于元组是不可变的,因此可以很容易地使元组的长度0(so ())在程序中保持不变.这会减少"构造时间"(因为它只会设置对常量的引用,所以没有)并减少分配的内存量.
我的问题是,对于Python解释器(即任何流行的解释器)是否有保证,空元组确实是一个常量,()因此不需要构造时间也不需要分配额外的内存.
测试它id(..)似乎支持这样的理论:确实只有一个零元组:
>>> id(())
140290183798856
>>> a = ()
>>> id(a)
140290183798856
Run Code Online (Sandbox Code Playgroud)
但有可能在运行时Python解释器出于某种原因分叉元组.
在CPython中,空元组是单例.永远只创建一个副本,然后在空发生器上使用()或使用时重复使用tuple().
该PyTuple_new()功能基本上是这样的:
if (size == 0 && free_list[0]) {
op = free_list[0];
Py_INCREF(op);
// ...
return (PyObject *) op;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果元组大小为0(空)并且free_list[0]对象存在(现有的空元组单例),则只需使用它.
请参阅如何在CPython中实现元组?了解更多详情free_list; CPython还将重新使用已经创建的tuple长度为20的实例.
这是一个实现细节.其他实现(Jython,IronPython,PyPy)不必执行相同的操作.
| 归档时间: |
|
| 查看次数: |
827 次 |
| 最近记录: |