sys.getsizeof()
1. 使用sys模块的getsizeof方法来检查对象使用内存的情况
# 使用前先导入模块sys
import sys
lt = [1, 2, 3]
sys.getsizeof(a)
2. 我们接下来用这个方法来比较一个range对象, 生成器和list的内存占用情况。
第一步:先准备三个对象
# 生成一个range对象
In [2]: my_range_list = range(10000)
# 使用列表推导式生成一个列表
In [3]: my_real_list = [i for i in range(10000)]
# 将列表表达式的[]换成()能够得到一个生成器
In [4]: my_generator_list = (i for i in range(10000))
第二步:打印内存占用情况
In [5]: import sys
# 通过sys.getsizeof来检查三个对象的内存使用状况
In [6]: sys.getsizeof(my_real_list)
Out[6]: 87624
In [7]: sys.getsizeof(my_generator_list)
Out[7]: 120
In [8]: sys.getsizeof(my_range_list)
Out[8]: 48
分析:
range 类型相比常规 list 或 tuple 的优势在于一个 range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 start, stop 和 step 值,并会根据需要计算具体单项或子范围的值)
>>>my_range_list = range(1000)
>>>my_range_list1 = range(1000000)
>>>sys.getsizeof(my_range_list1)
48
>>>sys.getsizeof(my_range_list1)
48
同样的,生成器的占用内存也是固定的(较小),原理和range对象是同样的,它保存的是产生元素的计算过程。
列表推导式则产生的是实际占用内存的列表,列表的所有元素都会在内存中。
在使用内存方面,range 和 生成器 远比实际的数字列表更加高效。