2011年11月8日 星期二

[Python]range() and xrange()

在Python中,我們在使用迴圈的時候經常會這樣寫

for i in range(0, 1000):
    print i
for i in xrange(0, 1000):
    print i
到底range()和xrange()有什麽差呢? 其實上面這兩個例子跑出來結果是一模一樣
最主要差別是range()會產生實際的list,而xrange()則是產生一個number generator
>>> range(5)
[0, 1, 2, 3, 4]
>>> xrange(5)
xrange(5)
>>> list(xrange(5))
[0, 1, 2, 3, 4]
range因為會產生實際list,因此當用在迴圈長度很大的時候,會佔掉很大一塊記憶體

for x in range(1, 1000000):
(range會產生一個1~1000000的list)

for x in xrange(1, 1000000):
相反地,因為xrange是產生一個1~1000000的number generator並每次回傳一個值給迴圈,在這個例子會比range()來的節省記憶體

因此建議在大範圍的迴圈盡量使用xrange(),除非你真的要產生一個list

當然有些例外,range()會比xrange來的好
比如說,當迴圈每次都固定會執行一個範圍時(不會中途break),使用range()會比xrange()來的有效率,因為不用每次都生成一個number(當然,記憶體一定是range使用的比較多)
另外當你真的需要list的時候,就只能使用range()


沒有留言:

張貼留言