83

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

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

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

下面的代码显然没用:

x=2**1000
len(x)

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

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

变量x是(十进制)是:

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

但上面的代码返回303

上面的 long long 序列的长度是 302,所以我认为303应该只与字符串长度有关。

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

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

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

int z=1;

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

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

4

2 回答 2

160

用于sys.getsizeof获取对象的大小,以字节为单位。

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

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

于 2013-01-17T04:02:54.723 回答
7

关于 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 位),计算速度明显更快。

于 2013-01-17T05:03:57.550 回答