Ich habe keine Ahnung, warum das passiert. Ich habe einige Listen durcheinander gebracht, und ich brauchte eine for
Schleife von 0 bis log(n, 2)
, wobei n die Länge einer Liste war. Aber der Code war erstaunlich langsam, also habe ich nach ein wenig Recherche herausgefunden, dass das Problem in der Bereichserzeugung liegt. Beispielcode für die Demonstration:Warum erstellt einen Bereich von 0 bis log (len (Liste), 2) so langsam?
n = len([1,2,3,4,5,6,7,8])
k = 8
timeit('range(log(n, 2))', number=2, repeat=3) # Test 1
timeit('range(log(k, 2))', number=2, repeat=3) # Test 2
Der Ausgang
2 loops, best of 3: 2.2 s per loop
2 loops, best of 3: 3.46 µs per loop
Die Anzahl der Tests ist gering (ich wollte nicht, dass dies mehr als 10 Minuten zu laufen), aber es zeigt bereits, dass range(log(n, 2))
ist Größenordnungen langsamer als das Gegenstück nur mit dem Logarithmus einer ganzen Zahl. Das ist wirklich überraschend und ich habe keine Ahnung warum dies passiert. Vielleicht ist ein Problem auf meinem PC, vielleicht ein Sage-Problem oder ein Python-Bug (ich habe es bei Python nicht gleich versucht).
Die Verwendung von xrange
anstelle von range
hilft auch nicht. Wenn Sie die Nummer mit .n()
erhalten, wird Test 1 mit der gleichen Geschwindigkeit von 2 ausgeführt.
Weiß jemand, was passieren kann? Danke!
Klingt wie eine Sage (vielleicht Cython?) Problem . Python 'range' nimmt nicht einmal Floats. –
Und Python hat auch nicht "log" im globalen Namespace (und keine Möglichkeit, es dorthin zu bringen, ohne ein "setup" zu "timeit" hinzuzufügen). Und "n" steht auch nicht zur Verfügung. Und es gibt keinen "Wiederholungs" -Parameter auf "Zeit" (von dem ich annehme, dass du mit "aus Zeiteinstellungs-Zeit" gekommen bist). – abarnert
Zeigt Ihre Ausgabe nicht eher an, dass die Werte, die Ihre 'Zeit 'zurückgibt, ziemlich zufällig sind? Immerhin haben Sie das gleiche zweimal versucht (sowohl 'n' als auch' k' sind 8) und haben massiv unterschiedliche Ergebnisse erhalten. – Alfe