我正在编写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 很大,我不知道它是否遵循相同的内存分配规则?
答案 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位),计算速度明显更快。