Pythons Int-Funktionsleistung

7

Versucht Pythons eingebaute Funktion int immer noch den übergebenen Wert zu konvertieren, auch wenn der Wert ist bereits eine ganze Zahl?

Genauer gesagt: Gibt es einen Leistungsunterschied zwischen int('42') und int(42) , der vom Konvertierungsalgorithmus verursacht wird?

    
vaultah 23.02.2014, 09:30
quelle

4 Antworten

5

Laut den Kommentaren im Quelltext ,

  

Konvertiert eine Zahl oder eine Zeichenfolge in eine ganze Zahl oder gibt 0 zurück, wenn keine Argumente vorhanden sind   sind gegeben. Wenn x eine Zahl ist, gebe x.__int__ () zurück. Für Fließkomma   Zahlen, diese schneidet gegen Null.

     

Wenn x keine Zahl ist oder wenn Base angegeben wird, muss x eine Zeichenkette sein,   Bytes oder Bytearray-Instanz, die ein Integer-Literal in der   gegebene Basis

Wenn also die Eingabe eine Zahl ist, wird __int__ function für dieses Objekt aufgerufen und das Ergebnis wird zurückgegeben. Intern nb_int ist ein Element in der PyNumberMethods-Struktur , das dem Prozentsatz entspricht. co_de% -Funktion. Laut dem neuesten Quellcode zum Zeitpunkt der Erstellung dieses Dokuments ist __int__ die Funktion, die entspricht der Funktion long_long , die wie folgt definiert ist

%Vor%

Hier nb_int ist ein Makro, das nur prüft, ob der aktuelles Objekt ist wirklich vom Typ lang. Wenn es wahr ist, erhöht es einfach die Referenzzählung und gibt das Objekt zurück, so wie es ist, nichts ist mehr getan.

Wenn die Eingabe in Form einer Zeichenfolge erfolgt, muss die Zeichenfolge in eine Zahl mit PyLong_checkExact Funktion.

    
thefourtheye 23.02.2014, 10:56
quelle
10

Dies wird in der Funktion long_long in Objects/longobject.c behandelt, wie es von den Augen erklärt wird:

%Vor%

Wenn also das Argument bereits ein int ist, wird der Referenzzähler inkrementiert und das gleiche Objekt zurückgegeben.

Sie können für unveränderliche Typen im Allgemeinen ein ähnliches Verhalten annehmen. Zum Beispiel gibt tuple(mytuple) einen neuen Verweis auf mytuple zurück, während list(mylist) dagegen eine Kopie von mylist erstellt.

    
Janne Karila 23.02.2014 09:55
quelle
6

Wenn Sie ein Objekt int an int() übergeben, erhalten Sie dasselbe Objekt zurück (CPython 3.3.2):

%Vor%

Ich weiß nicht, was Sie unter "algorithmische Leistungsdifferenz" verstehen, aber es erstellt kein neues Objekt.

    
jonrsharpe 23.02.2014 09:52
quelle
1

Warum vergleichen Sie nicht einfach beide?

%Vor%     
Hyperboreus 23.02.2014 09:33
quelle