timeit
deaktiviert den Garbage Collector, der andernfalls die Zyklen unterbricht, die ein Klassenobjekt am Leben erhalten. Daher wird keine der Klassen freigegeben, bis timeit
beendet ist.
object.__subclasses__()
verweist auf diese Klassen über eine interne Sammlung von schwachen Referenzen. Die alte listenbasierte Implementierung von tp_subclasses
durchsucht die gesamte Liste jedes Mal, um eine tote Referenz zu finden, die ersetzt werden kann. Dieser Prozess benötigt mehr Zeit mit jeder zusätzlichen Unterklasse. Auf der anderen Seite kann das neue dict-basierte Design in 3.4 eine Referenz in konstanter Zeit hinzufügen. Siehe Problem 17936 .
Danke an @ MichaelYounkin zum Hinweis, wie dies auch in 3.2 langsam ist. Anfangs versuchte ich, den Leistungsunterschied auf eine Änderung im Small-Object-Allokator zwischen 2.x und 3.x einzugrenzen, aber nachdem ich seinen Kommentar gelesen hatte, stellte ich fest, dass sogar 3.3 wesentlich langsamer war als 3.4. Also habe ich den Typobject.c Filelog durchsucht, um die letzten Änderungen zu überprüfen.
Nun, das Problem scheint mit alten Stil vs. neuen Stil Klassen in Python 2.7 zu sein.
In Python 3.4 können Sie sehen, dass der Unterschied zwischen der Verwendung eines Objekts und der Nichtbenutzung nur das Laden des Symbols ist (nicht so signifikant):
%Vor%Während Sie in Python 2.7 sind, haben Sie einen weiteren Schritt, der LOAD_TUPLE beinhaltet:
%Vor%Tags und Links python performance python-3.x python-2.7