2016-09-12 3 views
1
$ python -m timeit -s'tes = "987kkv45kk321"*100' 'a = [list(i) for i in tes.split("kk")]' 
10000 loops, best of 3: 79.4 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"*100' 'b = list(map(list, tes.split("kk")))' 
10000 loops, best of 3: 66.9 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"*10' 'a = [list(i) for i in tes.split("kk")]' 
100000 loops, best of 3: 8.34 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"*10' 'b = list(map(list, tes.split("kk")))' 
100000 loops, best of 3: 7.38 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"' 'a = [list(i) for i in tes.split("kk")]' 
1000000 loops, best of 3: 1.51 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"' 'b = list(map(list, tes.split("kk")))' 
1000000 loops, best of 3: 1.63 usec per loop 

Ich versuchte timeit mit und frag mich, warum Liste von Listen von string.split Erstellen von() mit Liste Verständnis für ein kürzeres String schneller, aber langsamer für längere Strings.Liste Verständnis und Karte ohne Lambda auf langer Schnur

+0

Ich denke, dass das Durchsuchen einer langen Liste für den Split einfach den Overhead erhöht. – Evert

Antwort

0

Die festen Setup-Kosten für map sind höher als die Setup-Kosten für die listcomp-Lösung. Aber die Stückkosten für map sind niedriger. Bei kurzen Eingaben zahlt map also mehr Fixkosten als die Kosten pro Artikel (weil es so wenige Artikel gibt). Wenn sich die Anzahl der Artikel erhöht, ändern sich die fixen Setup-Kosten für map nicht, aber die Einsparungen pro Artikel werden für weitere Artikel geerntet, sodass map langsam voranschreitet.

Dinge, die map spart:

  1. nachschlägt Nur list einmal (die listcomp es jede einzelne Schleife im eingebauten Namensraum zu suchen hat oben, nachdem die verschachtelten und globale Bereiche erste Überprüfung, weil es‘ t Garantie list wird nicht von Schleife zu Schleife überschrieben)
  2. Führt keinen Python-Bytecode pro Element aus (weil die Mapping-Funktion ebenfalls C-Level ist), so dass der Interpreter überhaupt nicht beteiligt ist und die Menge an C-Level reduziert Code

map auf dem tatsächlichen Anruf verliert an map (C eingebaute Funktionen schnell zu laufen, aber vergleichsweise langsam zu nennen, vor allem, wenn sie mit variabler Länge Argumenten) und der Erstellung und Bereinigung des map Objekts (der listcomp Verschluss vorne zusammengestellt). Aber wie ich oben angemerkt habe, ist keiner von diesen an die Größe der Eingänge gebunden, so dass Sie sie schnell wieder aufholen, wenn die Mapping-Funktion ein eingebautes C ist.

0

Diese Art von Timing ist im Grunde nutzlos.

Die Zeitrahmen, die Sie erhalten, sind in Mikrosekunden - und Sie erstellen nur Dutzende von verschiedenen Ein-Zeichen-langen Elementen Liste in jeder Interaktion. Sie erhalten grundsätzlich einen linearen Typ, da die Anzahl der von Ihnen erstellten Objekte proportional zu Ihren String-Längen ist. Das überrascht kaum.

+0

Ah! Okay, ich verstehe das lineare Ding. Danke, übrigens – wvjgsuhp

Verwandte Themen