python生成器效能測試

2021-08-22 12:13:04 字數 2334 閱讀 9380

本文參考自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 語句的函式,就是生成器函式,呼叫後返...