Python列表(元组)中每个元素有多少个字节?

时间:2008-09-25 20:04:09

标签: python memory-management

例如,存储一百万(32位)整数列表需要多少内存?

alist = range(1000000) # or list(range(1000000)) in Python 3.0

6 个答案:

答案 0 :(得分:23)

“这取决于。” Python为列表分配空间,以便实现amortized constant time以便将元素附加到列表中。

实际上,这与当前实现的含义是......列表总是为两个幂的元素分配空间。所以range(1000000)实际上会分配一个足够大的列表来容纳2 ^ 20个元素(~10.45亿)。

这只是存储列表结构本身所需的空间(这是指向每个元素的Python对象的指针数组)。 32位系统每个元素需要4个字节,64位系统每个元素需要8个字节。

此外,您需要空间来存储实际元素。这种差异很大。对于小整数(当前为-5到256),不需要额外的空间,但是对于较大的数字,Python为每个整数分配一个新对象,这需要10-100个字节,并且往往会破坏内存。

底线:它很复杂并且Python列表是存储大型同构数据结构的好方法。为此,使用array模块,或者,如果需要进行矢量化数学,请使用NumPy。

PS-Tuples与列表不同,未设计以逐渐附加元素。我不知道分配器是如何工作的,但是甚至不考虑将它用于大型数据结构: - )

答案 1 :(得分:14)

有用的链接:

How to get memory size/usage of python object

Memory sizes of python objects?

if you put data into dictionary, how do we calculate the data size?

然而,他们没有给出确定的答案。要走的路:

  1. 测量带有/不带列表的Python解释器消耗的内存(使用操作系统工具)。

  2. 使用第三方扩展模块定义某种sizeof(PyObject)。

  3. <强>更新

    Recipe 546530: Size of Python objects (revised)

    import asizeof
    
    N = 1000000
    print asizeof.asizeof(range(N)) / N
    # -> 20 (python 2.5, WinXP, 32-bit Linux)
    # -> 33 (64-bit Linux)
    

答案 2 :(得分:6)

解决问题的“元组”部分

在典型的构建配置中声明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[]数组为根的对象图所消耗的总字节数。

值得注意的是,元组构造例程确保只创建单个空元组实例(单例)。

参考文献: Python.hobject.htupleobject.htupleobject.c

答案 3 :(得分:3)

  

新功能getsizeof()需要一个   Python对象并返回金额   测量对象使用的内存   以字节为单位内置对象返回   正确的结果;第三方   扩展可能不会,但可以定义一个   <{1}}方法返回对象的大小。

__sizeof__()

显然,返回的数字不包含所包含对象占用的内存(sys.getsizeof(1)== 12)。

答案 4 :(得分:2)

这是特定于实现的,我很确定。当然它取决于整数的内部表示 - 你不能假设它们将被存储为32位,因为Python会给你任意大的整数,所以也许小的int更紧凑地存储。

在我的Python上(Fedora 9上的2.5.1核心2二重奏),分配前的VmSize是6896kB,之后是22684kB。经过一百万元素分配后,VmSize达到38340kB。对于1000000个整数,这非常粗略地表示大约16000kB,每个整数大约16个字节。这表明列表的开销很多。我会用一小撮盐给这些数字。

答案 5 :(得分:-1)

我很担心你问的原因。您是否想知道给定实现需要多少内存?说,你将阅读10,000,000个小部件,并想知道它会吸多少RAM?

如果是这种情况,而不是试图弄清楚每个小部件需要多少RAM,那么可以计算出多少RAM,比如10,000个小部件需要多少才能获得实际大小。