你正在混合幾件事。
def list_gen(n):
i=0
while i<n:
yield i
i += 1
這個函數是一個發電機。調用它將返回一個生成器對象,它是一個迭代器。
迭代器具有next()
,即它可以遍歷一次。每當您執行for i in something
時,都會使用iter
創建迭代器。
def list_gen(n):
return range(n)
def list_gen(n):
return xrange(n)
這些函數是常規函數。一個返回list
,另一個返回一個xrange
對象。列表和xrange都是可迭代的,即可以爲它們創建多個獨立的迭代器。
所以回到你的問題:你詢問是否返回list
或xrange
對象。
很明顯,這取決於!這取決於你想要對結果做什麼。
如果你想以某種方式改變它,那麼你需要一個真正的列表。直接使用range
。
如果只想遍歷它,那麼它不會使語義上的差別:既是xrange
對象,並通過range
返回將產生一個迭代器,它迭代同一序列的list
。
但是,如果您使用xrange
,則永遠不會在內存中創建整個列表。爲什麼要在內存中創建一個完整的list
對象,如果你只想做一個簡單的迭代?當你想要一個for
循環時,你不需要分配一個臨時的大內存緩衝區,對吧?
因此:它是安全的堅持與xrange
,因爲主叫方總是可以做出list
出來。
讓我們用一個基準來確認。我們想知道迭代xranges的速度是否快於由range
(當然包括range
調用的成本)構建的列表。
代碼:
import timeit
ns = [1,2,3, 5, 10, 50, 100]
print 'n', '\t', 'range', '\t', 'xrange'
for n in ns:
t1 = timeit.timeit("for i in range({}): pass".format(n))
t2 = timeit.timeit("for i in xrange({}): pass".format(n))
print n, '\t', t1, '\t', t2
結果:
n range xrange
1 0.566222990493 0.418698436395
2 0.594136874362 0.477882061758
3 0.630704800817 0.488603362929
5 0.725149288913 0.540597548519
10 0.90297752809 0.687031507818
50 2.44493085566 1.89102105759
100 4.31189321914 3.33713522433
來源
2012-11-29 09:46:40
Kos
你是說'return xrange(n)'或'return range(n)'對嗎? – Kos
@Kos是的,我正在修復這個錯誤。 – Dreampuf
生成器使用的內存少於列表。因此,如果內存太有限以至於無法創建迭代器,那麼它也無法創建列表。 –