Python:检查对象使用内存的情况

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 和 生成器 远比实际的数字列表更加高效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章