Python中变量的内存大小

时间:2013-01-17 03:59:23

标签: python variables memory

我正在编写Python代码来进行一些大数计算,并且对计算中使用的内存非常关注。

因此,我想计算每个变量的每一位。

例如,我有一个变量 x ,这是一个很大的数字,并且想要计算代表 x 的位数。

以下代码显然无用:

x=2**1000
len(x)

因此,我转而使用以下代码:

x=2**1000
len(repr(x))

变量 x 是(十进制):

  

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

但上面的代码返回 303

上面的长序列长度为302,因此我认为 303 应仅与字符串长度相关。

所以,这是我原来的问题:

如何知道变量 x 的内存大小?

还有一件事;在C / C ++语言中,如果我定义

int z=1;

这意味着有4个字节= 32位分配给 z ,这些位排列为00..001(31 0和1)。

这里,我的变量 x 很大,我不知道它是否遵循相同的内存分配规则?

2 个答案:

答案 0 :(得分:82)

使用sys.getsizeof获取对象的大小(以字节为单位)。

>>> from sys import getsizeof
>>> a = 42
>>> getsizeof(a)
12
>>> a = 2**1000
>>> getsizeof(a)
146
>>>

请注意,对象的大小和布局纯粹是特定于实现的。例如,CPython可能使用与IronPython完全不同的内部数据结构。因此,对象的大小可能因实现而异。

答案 1 :(得分:5)

关于Python long的内部结构,请检查sys.int_info(或Python 2.7的sys.long_info)。

>>> import sys
>>> sys.int_info
sys.int_info(bits_per_digit=30, sizeof_digit=4)

Python将30位存储到4个字节(大多数64位系统)或15位存储到2个字节(大多数32位系统)。将实际内存使用情况与计算值进行比较,我得到了

>>> import math, sys
>>> a=0
>>> sys.getsizeof(a)
24
>>> a=2**100
>>> sys.getsizeof(a)
40
>>> a=2**1000
>>> sys.getsizeof(a)
160
>>> 24+4*math.ceil(100/30)
40
>>> 24+4*math.ceil(1000/30)
160

由于没有存储位,因此0的开销有24个字节。较大值的内存要求与计算值匹配。

如果您的数字太大以至于您担心6.25%的未使用位,您应该查看gmpy2库。内部表示使用所有可用位,并且对于大值(例如,大于100位),计算速度明显更快。