Python: Iteration über Liste vs über dict Elemente Effizienz

Ist some_dict.items() über some_dict.items() so effizient wie Iteration über eine Liste der gleichen Elemente in CPython?

3 Solutions collect form web for “Python: Iteration über Liste vs über dict Elemente Effizienz”

Es hängt davon ab, welche Version von Python Sie verwenden. In Python 2 erstellt some_dict.items() eine neue Liste, die einige zusätzliche Zeit in some_dict.items() nimmt und zusätzlichen Speicher verwendet. Auf der anderen Seite, sobald die Liste erstellt ist, ist es eine Liste, und so sollte identische Leistungsmerkmale haben, nachdem der Overhead der Listenerstellung abgeschlossen ist.

In Python 3 erstellt some_dict.items() ein View-Objekt anstelle einer Liste und ich some_dict.items() , dass das Erstellen und Iterieren über items() schneller als in Python 2 wäre, da nichts kopiert werden muss. Aber ich erwarte auch , dass die Iteration über eine bereits erstellte Ansicht etwas langsamer als die Iteration über eine bereits erstellte Liste wäre, weil Wörterbuchdaten etwas spärlich gespeichert sind, und ich glaube, es gibt keinen guten Weg für Python, um zu vermeiden, dass sie über jeden Bin in Das Wörterbuch – auch die leeren.

In Python 2 bestätigen einige Timings meine Intuitionen:

 >>> some_dict = dict(zip(xrange(1000), reversed(xrange(1000)))) >>> some_list = zip(xrange(1000), xrange(1000)) >>> %timeit for t in some_list: t 10000 loops, best of 3: 25.6 us per loop >>> %timeit for t in some_dict.items(): t 10000 loops, best of 3: 57.3 us per loop 

Iterating über die items ist etwa doppelt so langsam. Mit iteritems ist ein bisschen schneller …

 >>> %timeit for t in some_dict.iteritems(): t 10000 loops, best of 3: 41.3 us per loop 

Aber Iteration über die Liste selbst ist im Grunde das gleiche wie Iteration über jede andere Liste:

 >>> some_dict_list = some_dict.items() >>> %timeit for t in some_dict_list: t 10000 loops, best of 3: 26.1 us per loop 

Python 3 kann erstellen und iterieren über items schneller als Python 2 kann (vergleiche 57,3 uns oben):

 >>> some_dict = dict(zip(range(1000), reversed(range(1000)))) >>> %timeit for t in some_dict.items(): t 10000 loops, best of 3: 33.4 us per loop 

Aber die Zeit, um eine Ansicht zu schaffen, ist vernachlässigbar; Es ist tatsächlich langsamer, um zu übertreiben als eine Liste.

 >>> some_list = list(zip(range(1000), reversed(range(1000)))) >>> some_dict_view = some_dict.items() >>> %timeit for t in some_list: t 10000 loops, best of 3: 18.6 us per loop >>> %timeit for t in some_dict_view: t 10000 loops, best of 3: 33.3 us per loop 

Dies bedeutet, dass in Python 3, wenn Sie wollen, um viele Male über die Elemente in einem Wörterbuch zu iterieren, und die Leistung ist kritisch, können Sie eine 30% Beschleunigung durch Zwischenspeichern der Ansicht als Liste.

 >>> some_list = list(some_dict_view) >>> %timeit for t in some_list: t 100000 loops, best of 3: 18.6 us per loop 

Ein kleiner Maßstab zeigt mir, dass das Erlöschen einer Liste definitiv schneller ist.

 def iterlist(list_): i = 0 for _ in list_: i += 1 return i def iterdict(dict_): i = 0 for _ in dict_.iteritems(): i += 1 return i def noiterdict(dict_): i = 0 for _ in dict_.items(): i += 1 return i list_ = range(1000000) dict_ = dict(zip(range(1000000), range(1000000))) 

Getestet mit IPython auf Python 2.7 (Kubuntu):

 %timeit iterlist(list_) 10 loops, best of 3: 28.5 ms per loop %timeit iterdict(dict_) 10 loops, best of 3: 39.7 ms per loop %timeit noiterdict(dict_) 10 loops, best of 3: 86.1 ms per loop 

Obwohl some_list durch some_list ist 2x speedup als some_dict.items() , aber some_list durch some_list nach Index ist fast so selben wie some_dict durch some_dict by key.

 K = 1000000 some_dict = dict(zip(xrange(K), reversed(xrange(K)))) some_list = zip(xrange(K), xrange(K)) %timeit for t in some_list: t 10 loops, best of 3: 55.7 ms per loop %timeit for i in xrange(len(some_list)):some_list[i] 10 loops, best of 3: 94 ms per loop %timeit for key in some_dict: some_dict[key] 10 loops, best of 3: 115 ms per loop %timeit for i,t in enumerate(some_list): t 10 loops, best of 3: 103 ms per loop 
  • Beschleunigt Millionen von Regex-Ersatz in Python 3
  • Effiziente Möglichkeit, das Element in einem Wörterbuch in Python mit einer Schleife zu zählen
  • Python-String 'join' ist schneller (?) Als '+', aber was ist hier falsch?
  • Python - finden Vorkommen der Liste der Zeichenfolgen innerhalb der Zeichenfolge
  • Python: Was ist der schnellste Weg, um Anrufe zuzuordnen oder zu komprimieren und Fehler zu ignorieren?
  • Warum ist mein Sieb von Eratosthenes so langsam?
  • Effizient finden Sie wiederholte Zeichen in einer Zeichenfolge
  • Überrascht über gute Rekursionsleistung in Python
  • Einstellen von Werten auf Pandas DataFrame Teilmenge (Kopie) ist langsam
  • Vergleichen Sie zwei verschiedene Größenmatrizen, um eine große Matrix zu machen - Geschwindigkeitsverbesserungen?
  • Wie lade die vorhandene db-Datei in den Speicher in Python sqlite3?
  • Python ist die beste Programmiersprache der Welt.