我了解到一个引用需要64位:
也就是说,引用结构通常使用64 位作为存储在数组中的内存地址,以及用于表示被视为元素的对象的任何位数。
我怎样才能看到它的实际效果?
In [75]: patients = ["trump", "Trump", "trumP"]
In [76]: id(patients[1])
Out[76]: 4529777048
In [77]: math.log2(4529777048)
Out[77]: 32.076792897710234
这是2**32
而不是2**64
.
对于math.log2(id(obj))
,你会问"2 的幂是多少次方,给我们内存中obj
的地址?
这不是id()
的工作方式。id()
为每个对象提供了一个恒定且唯一的值。在CPython中,这是内存中对象的地址。
在 64 位系统上,将此地址存储在 64 位变量中是有意义的,因为您无法使用 32 位变量覆盖整个地址空间。
但是,64位引用并不意味着每个对象的地址都是2**64
。截至2018年,这甚至是不可能的,因为我们的x86_64 PC只有一个48位地址空间。您的第一个患者的ID接近2**32
(主要是(巧合。
id
将返回内存中的地址。所以,这不是你要找的。
通常,在 Python 中获取内存大小的一种方法是使用sys.getsizeof()
。但是,这将返回对象的大小。您对该对象的引用的大小感兴趣。
但是,您仍然可以或多或少地计算如下:8 * struct.calcsize("P")
.这基本上可以揭示您使用的是 32 位还是 64 位系统,因此您知道引用的大小。但真正通过检查参考来计算它,我不知道这是否可能。