本文參考自python生成器
在建立大容量列表時,列表中元素的數量很多,會導致列表占用的記憶體空間很大。這種情況下,如果能能記錄列表中的當前的元素值以及計算下乙個元素的演算法(類似於迭代器),那麼相當於記憶體中只需要儲存乙個元素以及一段演算法,記憶體佔用率將顯著降低。生成器就是python提供的這樣一種物件,他也是一種迭代器。本文通過乙個自然數列表求和的方法,比較列表和生成器對記憶體的佔用率。
0. 記憶體統計函式
echo > memory_statistics.txt
while true
donow_time=$(date "+%y-%m-%d %h:%m:%s")
memory_usage=`free -h |grep mem | awk ''`
echo -n $now_time >> memory_statistics.txt
echo " $memory_usage" >> memory_statistics.txt
sleep 0.5
done
該函式將會每個0.5秒記錄系統記憶體的使用率
1. 先看一段自然數求和的函式
import datetime
def firstn(n):
num, nums = 0,
while num < n:
num += 1
return nums
if __name__ == "__main__":
print datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
a = firstn(20000000)
print datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
suma = sum(a)
print datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
print suma
很簡單的函式,先生成乙個0到n的列表,然後求和,這段時間內的記憶體使用率統計如下:
可以看到在2018-08-08 22:41:31到2018-08-08 22:41:34這段時間內,記憶體急速增加,占用了600m左右記憶體。同時可見,構造列表花了3秒,sum函式求和用的時間反倒很少。
2. 接下來我們來實現一種迭代器
import datetime
class firstn(object):
def __init__(self, n):
self.n = n
self.num = 0
self.nums =
def __iter__(self):
return self
def __next__(self):
return self.next()
def next(self):
if self.num < self.n:
cur, self.num = self.num, self.num + 1
return cur
else:
raise stopiteration()
print datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
firstn = firstn(20000000)
print datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
print sum(firstn)
print datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
這段函式首先構造了乙個迭代器,可以這個迭代器儲存當前的元素(self.num)和求計算下乙個元素的演算法(當前元素增加1),我們來看看這個迭代器的效能
我們可以看到記憶體使用率增加3m,迭代器產生速度遠快於列表,但是在求和階段,花費了9秒的時間,也遠多於列表求和。從這裡也可以看出,空間和時間不可兼得。
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...