Python 3: Loops, Listenverständnis und Karte langsamer im Vergleich zu Python 2?

Ich lerne derzeit Python 3 und dachte, einige Geschwindigkeit Vergleich könnte ordentlich sein. So habe ich einige an Ort und einige temporäre Listenfunktionen erstellt, die einfach 1 zu einer langen Liste von ganzen Zahlen hinzufügen.

Allerdings waren die Ergebnisse für mich wirklich überraschend … es scheint, dass Python 3 in jedem Anwendungsfall langsamer ist: Verschiedene Tests für Loops, eine while-Schleife, die Map-Funktion und Listenverständnisse.

Natürlich (siehe den Code unten) es nur Vergleich von In-Place-Liste Mutationen oder Schleifen, die aufbauen und eine temporäre Liste zurückgeben … also zB die "Standard" -Karte von Python 3, die nur einen Iterator erstellt, ist immer noch schnell , Aber irgendwann würde man gerne die Daten drucken, schreiben oder irgendwie visualisieren. Also, etwas wie list(map()) sollte relativ häufig in Python 3 ?!

Was fehlt mir hier

Ist Python 3 wirklich langsamer als Python 2 für Loops, Verständnisse und Karte? Wenn ja, warum?


Python 3.4 Timings :

 > python3.4 func_speed_tests.py list_comprehension.........1.2785s for_loop...................1.9988s for_loop_append............1.8471s for_loop_range.............1.7585s while_loop.................2.2539s calc_map...................2.0763s 

Python 2.7 Timings :

 > python2.7 func_speed_tests.py list_comprehension.........0.9472s for_loop...................1.2821s for_loop_append............1.5663s for_loop_range.............1.3101s while_loop.................2.1914s calc_map...................1.9101s 

Hier ist der Code :

 import timeit from random import shuffle # generate a long list of integers mlst = list(range(0, 1000000)) # randomly sort the list shuffle(mlst) # number of benchmark passes n = 10 ##################### # functions to time # ##################### def list_comprehension(lst): return [x + 1 for x in lst] def for_loop(lst): for k, v in enumerate(lst): lst[k] = v + 1 def for_loop_append(lst): tmp = [] for item in lst: tmp.append(item + 1) def for_loop_range(lst): for k in range(len(lst)): lst[k] += 1 return lst def while_loop(lst): it = iter(lst) tmp = [] while it: try: tmp.append(next(it)+1) except StopIteration: break return tmp def calc_map(lst): lst = map(lambda x: x + 1, lst) return list(lst) ############################################ # helper functions for timing and printing # ############################################ def print_time(func_name): print("{:.<25}{:.>8.4f}s".format(func_name, timer(func_name))) def timer(func): return timeit.timeit(stmt="{}(mlst)".format(func), setup="from __main__ import mlst, {}".format(func), number=n) ################# # run the tests # ################# print_time("list_comprehension") print_time("for_loop") print_time("for_loop_append") print_time("for_loop_range") print_time("while_loop") print_time("calc_map") 

  • Warum verlangsamt sich dieses Python-Multiprocessing-Skript nach einer Weile?
  • Python: Ein Dict aus einer Liste, die auf etwas im Dict basiert
  • Python-Multiprocessing - Pipe vs Queue
  • Ersetzen der leeren Zeichenfolgen in einer Zeichenfolge
  • Was sind andere Optionen für schneller io in Python 2.7
  • Matplotlib savefig performance, sparen mehrere pngs in loop
  • One Solution collect form web for “Python 3: Loops, Listenverständnis und Karte langsamer im Vergleich zu Python 2?”

    Python3 ist etwas langsamer, dass Python2. Überprüfen Sie mit pystone Benchmark . Wenn die Geschwindigkeit von Interesse ist, halten Sie sich mit Python 2.7.0 Release, die eine bessere Unterstützung von Drittanbietern hat.

    Python ist die beste Programmiersprache der Welt.