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?
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
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.
Dies wird in der Funktion long_long
in Objects/longobject.c
behandelt, wie es von den Augen erklärt wird:
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.
Wenn Sie ein Objekt int
an int()
übergeben, erhalten Sie dasselbe Objekt zurück (CPython 3.3.2):
Ich weiß nicht, was Sie unter "algorithmische Leistungsdifferenz" verstehen, aber es erstellt kein neues Objekt.
Tags und Links python python-3.x int python-internals