Python中变量的内存大小[重复]

Posted

技术标签:

【中文标题】Python中变量的内存大小[重复]【英文标题】:Variable's memory size in Python [duplicate] 【发布时间】:2012-12-31 13:47:18 【问题描述】:

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

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

比如我有一个变量x,这是一个很大的数字,想统计一下代表x的位数。

下面的代码显然没用:

x=2**1000
len(x)

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

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

变量x是(十进制)是:

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 P>

但是上面的代码返回303

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

所以,我原来的问题来了:

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

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

int z=1;

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

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

【问题讨论】:

刚刚发现 sys.getsizeof(x) 好像有用?我用的是sys.getsizeof(x),其中x=2**1000,这样的指令返回160。这是否意味着x占用160字节?还是实际上是 160 位? 除非您处理的是极低级别的硬件实现,否则没有人可以用比特来衡量任何东西。对于大多数意图和目的而言,最低的计算单元是byte 【参考方案1】:

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

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

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

【讨论】:

谢谢,那内存怎么安排? 你不知道。这是您正在使用的 python 版本的实现细节。这完全取决于他们如何在内部管理任意大小的整数。 谢谢!虽然内存安排是版本相关的,但你有什么想法或网站建议有更多这样的内存实现细节吗? 你可以从python.org/dev/peps/pep-0237开始 ***.com/questions/1331471/… 显示不同 python 版本的大小。【参考方案2】:

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

【讨论】:

以上是关于Python中变量的内存大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章

确保内存分配的大小正确[重复]

python 获取变量的内存大小

如何查找对象分配的总内存[重复]

如何在 Go 中获取变量的内存大小?

C语言中结构体变量所占内存大小的计算

如何查找“进程”占用的大小/内存空间[重复]