2012-08-16 108 views
11

可能重複:
Only index needed: enumerate or (x)range?範圍(len(list))還是枚舉(list)?

其中哪些會被認爲是更好/更清晰/更快/更 'Python化'?我不在意列表L的內容,只是它有多長。

a = [f(n) for n, _ in enumerate(L)] 

a = [f(n) for n in range(len(L))] 

如果這有什麼差別,功能f利用的len(list)爲好。

+0

你使用的是什麼版本的python? – 2012-08-16 15:04:23

+0

@InbarRose - 2.7 – 2012-08-16 15:04:50

回答

18

一些快速定時運行似乎給使用range()略佔優勢的第二個選項在enumerate()

timeit a = [f(n) for n, _ in enumerate(mlist)] 
10000 loops, best of 3: 118 us per loop 

timeit a = [f(n) for n in range(len(mlist))] 
10000 loops, best of 3: 102 us per loop 

,只是使用xrange()(Python的V2.7.2)樂趣

timeit a = [f(n) for n in xrange(len(mlist))] 
10000 loops, best of 3: 99 us per loop 

我會首先使用可讀代碼,然後使用xrange()(如果可用)(即Pre-Python v 3.x),然後使用range()enumerate()

+0

當您想要重複訪問其索引處的列表項時,枚舉速度會更快。當你只需要一個索引列表時,使用len()和range/xrange會更快。 – 2016-11-20 17:31:36

4

(x)範圍解決方案速度更快,因爲它具有更少的開銷,所以我會使用它。

在Python 2.x中,使用xrange而不是range,因爲xrange使用較少的內存,因爲它不創建臨時列表。在Python 3.x中,只有range,這是內存較少的版本。

+0

xrange是發電機對象嗎? [documentation](http://docs.python.org/library/functions.html#xrange)沒有提到這個詞,儘管你的描述聽起來像是這樣。 – 2012-08-16 15:08:29

+2

它不是一個生成器對象(即它的主體中帶有'yield'的純Python代碼),但它等同於用C實現的那個對象。它有一個'.next()'方法,它返回下一個值或引發StopIteration,並且'for'循環重複調用這個'.next()'方法。 (如果您覺得它有用,請將我的答案投票。) – pts 2012-08-17 12:25:03

0

我會說,因爲您沒有使用enumarate函數的「_」屬性,所以使用範圍,因爲它更具可讀性。

1

假設你使用Python 2.x,如果你使用len(),你應該使用xrange(),因爲它可以避免創建一個範圍內的數字列表。

而在這種情況下,我會用len(),因爲您使用的是索引,而不是列表中的項目。