Kürzere Laufzeit von 'random.shuffle' bei Verwendung von 'random.random' als Schlüsselwortargument in Python3

8

Ich habe gerade beobachtet, dass das Mischen einer Liste mit random.shuffle bei der Verwendung von Python3 ungefähr die Hälfte der Laufzeit benötigt, wenn die Funktion random.random für das random Schlüsselwortargument explizit übergeben wird. Ich habe überprüft, ob Python2 das gleiche Problem hat, aber festgestellt, dass es nur mit Python3 auftritt.

Ich verwende den folgenden Code, um die Laufzeit der beiden Versionen zu messen:

%Vor%

Ich habe einen Testfall bei ideone gemacht, damit Sie Python3 und den gleichen Code mit Python2 .

Laut der Dokumentation zum Shuffle wird die gleiche Funktion random.random verwendet der Standardfall, wenn ich das optionale Schlüsselwort argument random weglasse, so sollte es keinen Unterschied geben, wenn ich ihm die gleiche Funktion gebe, um die Zufallszahl wie im Standardfall zu erzeugen.

Ich habe die entsprechenden Quellen (Python2 vs. Python3) für die Funktion shuffle in den Lib/random.py Ordnern geprüft und festgestellt, dass sie sich genauso verhalten wenn ich die Python3 Version explizit mit a Funktion für das Schlüsselwort random . Wenn ich dieses Argument weglasse, verwendet Python3 die Hilfsfunktion _randbelow , so dass es die Wurzel für mein Problem geben sollte. Ich kann nicht sehen, warum Python3 _randbelow verwendet, weil es shuffle down verlangsamt. Soweit ich es verstehe, liegt der Vorteil darin, willkürlich große Zufallszahlen zu erzeugen, aber es sollte nicht mein Mischen einer Liste verlangsamen, die viel weniger als 2 ^ 32 Elemente (100000 in meinem Fall) hat.

Kann mir jemand erklären, warum ich einen solchen Unterschied in den Laufzeiten sehe, obwohl sie enger zusammen sein sollten, wenn ich Python3 benutze?

PS .: Bitte beachten Sie, dass es mich nicht interessiert, warum die Laufzeit mit Python2 besser ist als mit Python3, aber der Unterschied in der Laufzeit, wenn das Argument rand=rand.rand in Python3 verwendet wird oder nicht in Python3.

    
halex 27.02.2013, 16:46
quelle

1 Antwort

4

Der Docstring in der Funktion random.shuffle widerspricht dem Code. In Python 2.7.2+ ist der Docstring korrekt:

%Vor%

Aber in Python 3.2 finden wir:

%Vor%

So erzählt der Docstring immer noch die alte Geschichte, aber jetzt ist die Standardfunktion random.randbelow

    
Schuh 27.02.2013 19:13
quelle