Warum gibt es einen Unterschied zwischen dem Erstellen von Klassen in Python 2.7 und Python 3.4?

9
%Vor%

Warum gibt es bei der Erstellung von Klassen so viele Unterschiede bei der Verwendung verschiedener Versionen von Python? Getestet auf dem gleichen Rechner:

  • i5-3450 CPU @ 3.10GHz
  • 8 GB RAM
Igor 03.11.2014, 11:30
quelle

2 Antworten

2

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.

    
eryksun 10.11.2014 09:36
quelle
0

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%     
Joaquin Sargiotto 08.11.2014 20:33
quelle