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 和 生成器 遠比實際的數字列表更加高效。