Python中范围在[1,2^30)
的整数对象需要28
字节,可以通过使用sys.getsizeof()
方法获取并在例如此stackoverflow帖子中解释。
然而,当我使用以下脚本测量内存占用时:
#int_list.py:
import sys
N=int(sys.argv[1])
lst=[0]*N # no overallocation
for i in range(N):
lst[i]=1000+i # ints not from integer pool
通过
/usr/bin/time -fpeak_used_memory:%M python3 int_list.py <N>
我获取到以下峰值内存值(Linux-x64, Python 3.6.2):
N Peak memory in Kb bytes/integer
-------------------------------------------
1 9220
1e7 404712 40.50
2e7 800612 40.52
3e7 1196204 40.52
4e7 1591948 40.52
看起来每个整数对象需要 40.5
字节,比 sys.getsizeof()
得到的结果多出12.5
字节。
额外的 8
字节很容易解释 - 列表 lst
并不包含整数对象本身,而是对它们的引用 - 这意味着需要一个额外的指针,即 8
字节。
然而,其余的 4.5
字节用于什么呢?
以下原因可以被排除:
- 整数对象的大小可变,但
10^7
小于2^30
,因此所有整数都将是28
字节。 - 列表
lst
中没有过度分配,这可以通过sys.getsizeof(lst)
轻松检查,该函数返回元素数量的8
倍,加上很小的开销。