我正在研究Python生成器並決定運行一個小實驗。爲什麼通過產量比由xrange產生的發電機產生的發電機更快?
TOTAL = 100000000
def my_sequence():
i = 0
while i < TOTAL:
yield i
i += 1
def my_list():
return range(TOTAL)
def my_xrange():
return xrange(TOTAL)
內存使用(使用psutil獲得進程RSS存儲器)和所用的時間(使用了time.time())中運行的每個方法數次,取平均後如下所示:
sequence_of_values = my_sequence() # Memory usage: 6782976B Time taken: 9.53674e-07 s
sequence_of_values2 = my_xrange() # Memory usage: 6774784B Time taken: 2.14576e-06 s
list_of_values = my_list() # Memory usage: 3266207744B Time taken: 1.80253s
我注意到使用xrange生成一個生成器一直(稍微)比使用yield更慢。爲什麼?
'xrange'是一個序列對象而不是生成器,因此它們的內部並不完全相同。此外,你給出的時間在xrange和發生器之間並沒有真正的顯着差異。事實上,這種差異可以忽略不計 – smac89
有一點需要解決的是在使用'xrange'時實際創建列表。在'my_xrange'函數中,您只返回xrange _generator_(它實際上不是一個生成器)。但尚未完成清單。所以它可能會比上面的數字更慢。 – aneroid
您只需計算構建生成器和構建「xrange」對象需要多少時間 - 您並未測量實際迭代這些對象所花費的時間量...... – mgilson