范围内的 Python-Integer-objects[1,2^30)需要28字节,如sys.getsizeof()在此 SO-post 中提供和解释的那样。
但是,当我使用以下脚本测量内存占用时:
#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每个整数对象都需要12.5字节,即字节比产生的多sys.getsizeof()。
额外的8字节很容易解释——列表lst不包含整数对象,而是对它们的引用——这意味着需要一个额外的指针,即8字节。
但是,其他4.5字节呢,它们是做什么用的?
可以排除以下原因:
整数对象的大小是可变的,但10^7
小于2^30
因此所有整数都将是28
字节大。
list 中没有过度分配lst
,可以很容易地检查sys.getsizeof(lst)
它,它产生8
了元素数量的倍数,加上非常小的开销。
暮色呼如
智慧大石
相关分类