2012-08-16 3 views
11

Mögliche Duplizieren:
Only index needed: enumerate or (x)range?Bereich (len (Liste)) oder enumerieren (Liste)?

Welche dieser würde als besser/klarer/schneller/'Pythonic'? Ich interessiere mich nicht für den Inhalt der Liste L, wie lange es ist.

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

oder

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

Wenn es einen Unterschied macht, ist die Funktion f macht auch Gebrauch von len(list).

+0

Welche Version von Python verwenden Sie? –

+0

@InbarRose - 2.7 –

Antwort

18

Einige schnelle Zeitläufe scheinen die zweite Option range() einen leichten Vorteil gegenüber enumerate() zu geben:

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 

und nur zum Spaß mit xrange() (Python V2.7.2)

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

würde ich favor lesbaren Code zuerst, dann mit xrange(), wenn verfügbar (dh Pre-Python v 3.x), gefolgt von range() und enumerate().

+0

Enumerate ist schneller, wenn Sie wiederholt auf die Listenelemente an ihrem Index zugreifen möchten. Wenn Sie nur eine Liste von Indizes möchten, ist es schneller, len() und range/xrange zu verwenden. –

4

Die (x) Bereich Lösung ist schneller, weil es weniger Overhead hat, also würde ich das verwenden.

Verwenden Sie in Python 2.x xrange anstelle von range, da xrange weniger Speicher verwendet, da keine temporäre Liste erstellt wird. In Python 3.x gibt es nur range, die die weniger Speicherversion ist.

+0

Ist 'xrange' ein Generatorobjekt? Die [Dokumentation] (http://docs.python.org/library/functions.html#xrange) erwähnt dieses Wort nicht, obwohl Ihre Beschreibung klingt wie es ist. –

+2

Es ist kein Generator-Objekt (dh reiner Python-Code mit 'yield' in seinem Körper), aber es ist äquivalent zu dem in C implementierten. Es hat eine' .next() 'Methode, die den nächsten Wert zurückgibt oder StopIteration auslöst Die 'for'-Schleife ruft diese' .next() 'Methode wiederholt auf. (Bitte stimmen Sie meine Antwort ab, wenn Sie es nützlich finden.) – pts

0

Ich würde sagen, dass Sie, da Sie nicht das Attribut "_" aus der Enumarate-Funktion verwenden, den Bereich verwenden, da er auf diese Weise besser lesbar ist.

1

Angenommen, Sie verwenden Python 2.x, wenn Sie len() verwenden, sollten Sie xrange() verwenden, da das Erstellen einer Liste mit den Zahlen im Bereich vermieden wird.

Und in diesem Fall würde ich mit len() gehen, weil Sie die Indizes verwenden, nicht die Elemente in der Liste.