变量';Python中的内存大小

变量';Python中的内存大小,python,variables,memory,Python,Variables,Memory,我正在编写Python代码来进行一些大数计算,并且非常关注计算中使用的内存 因此,我想计算每个变量的每一位 例如,我有一个变量x,这是一个大数字,我想计算表示x的位数 以下代码显然是无用的: x=2**1000 len(x) 因此,我转而使用以下代码: x=2**1000 len(repr(x)) 变量x是(十进制)是: 10715086071862673209484250490600011810514048117055360744375038837035112493612249319837

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

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

例如,我有一个变量x,这是一个大数字,我想计算表示x的位数

以下代码显然是无用的:

x=2**1000
len(x)
因此,我转而使用以下代码:

x=2**1000
len(repr(x))
变量x是(十进制)是:

1071508607186267320948425049060001181051404811705536074437503883703511249361224931983788156955812759467291755314682587145285692314043598457746985748574803345674824230985421074605623711418754182153647498358194126739876761655946077069145711964776767676766042316526286767656680376

但是上面的代码返回303

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

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

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

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

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

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

用于获取对象的大小(以字节为单位)

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

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

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

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%的未使用位,那么您可能应该查看库。内部表示使用所有可用位,对于较大的值(例如,大于100位),计算速度明显加快。

我刚刚发现sys.getsizeof(x)似乎很有用?我使用sys.getsizeof(x),其中x=2**1000,这样的指令返回160。这是否意味着x占用160字节?或者实际上是160位?除非你在处理极低级别的硬件实现,否则没有人用位来衡量任何东西。在大多数情况下,计算的最低单位是
字节
。谢谢,那么内存是如何安排的呢?你不知道。这是您正在使用的python版本的实现细节。这完全取决于他们如何在内部管理任意大小的整数。谢谢!虽然内存的安排取决于版本,但您有没有任何想法或网站建议,可以提供更多这样的内存实现细节?您可以从显示不同python版本上的大小开始。
>>> 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