Python列表(元组)中每个元素有多少个字节?
例如,需要多少内存来存储一百万(32位)整数列表?
alist = range(1000000) # or list(range(1000000)) in Python 3.0
“这取决于。” Python以这种方式为列表分配空间,以实现将元素附加到列表的分摊恒定时间。
实际上,这对于当前实现意味着什么......该列表总是具有分配给两个幂数的元素的空间。 所以范围(1000000)实际上会分配一个足够容纳2 ^ 20个元素(〜104.5万)的列表。
这只是存储列表结构本身所需的空间(这是指向每个元素的Python对象的指针数组)。 一个32位系统将需要每个元素4个字节,一个64位系统将使用每个元素8个字节。
此外,您需要空间来存储实际元素。 这种差异很大。 对于小整数(当前为-5到256),不需要额外的空间,但对于更大的数字,Python会为每个整数分配一个新对象,这需要10-100个字节,并倾向于分割内存。
底线:这很复杂,Python列表不是存储大量同类数据结构的好方法。 为此,请使用array
模块,或者,如果您需要执行矢量化数学运算,请使用NumPy。
与列表不同,PS元组没有被设计为具有逐步添加到它们的元素。 我不知道分配器是如何工作的,但是甚至不考虑将它用于大型数据结构:-)
有用的链接:
如何获得python对象的内存大小/使用情况
python对象的内存大小?
如果您将数据放入字典中,我们如何计算数据大小?
但是他们没有给出明确的答案。 走的路:
测量Python解释器使用/不使用列表所使用的内存(使用操作系统工具)。
使用定义某种sizeof(PyObject)的第三方扩展模块。
更新 :
食谱546530:Python对象的大小(修改)
import asizeof
N = 1000000
print asizeof.asizeof(range(N)) / N
# -> 20 (python 2.5, WinXP, 32-bit Linux)
# -> 33 (64-bit Linux)
解决问题的“元组”部分
在典型的构建配置中,CPython的PyTuple声明归结为:
struct PyTuple {
size_t refcount; // tuple's reference count
typeobject *type; // tuple type object
size_t n_items; // number of items in tuple
PyObject *items[1]; // contains space for n_items elements
};
PyTuple实例的大小在构建过程中是固定的,之后不能更改。 PyTuple占用的字节数可以计算为
sizeof(size_t) x 2 + sizeof(void*) x (n_items + 1)
。
这给出了元组的浅层大小。 要获得完整大小,还需要添加根源于PyTuple::items[]
数组的对象图消耗的总字节数。
值得注意的是,元组构造例程确保只创建空元组的单个实例(singleton)。
参考文献:Python.h,object.h,tupleobject.h,tupleobject.c
链接地址: http://www.djcxy.com/p/53573.html上一篇: How many bytes per element are there in a Python list (tuple)?
下一篇: Convert flat list to dictionary with keys at regular intervals