Python中变量的内存大小

use*_*478 49 python memory variables

我正在编写Python代码来进行一些大数计算,并严重关注计算中使用的内存.

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

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

以下代码显然没用:

x=2**1000
len(x)
Run Code Online (Sandbox Code Playgroud)

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

x=2**1000
len(repr(x))
Run Code Online (Sandbox Code Playgroud)

变量x是(十进制)是:

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

但上面的代码返回303

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

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

我怎么知道变量x的内存大小?

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

int z=1;
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*art 97

使用sys.getsizeof得到一个对象的大小,以字节为单位.

>>> from sys import getsizeof
>>> a = 42
>>> getsizeof(a)
12
>>> a = 2**1000
>>> getsizeof(a)
146
>>>
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以从http://www.python.org/dev/peps/pep-0237/开始 (2认同)
  • http://stackoverflow.com/questions/1331471/in-memory-size-of-python-stucture显示了不同python版本的大小. (2认同)

cas*_*evh 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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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