Verwenden von __slots__ unter PyPy

8

Ich habe diesen einfachen Code, mit dem ich messen konnte, wie Klassen mit __slots__ funktionieren (aus hier ):

%Vor%

Wenn ich es über python2.7 laufe - ich würde etwas um 6 Sekunden bekommen - ok, es ist wirklich schneller (und auch speichereffizienter) als ohne Slots.

Aber, wenn ich den Code unter PyPy (unter Verwendung von 2.2.1 - 64bit für Mac OS / X) laufen lasse, beginnt er, 100% CPU zu verwenden und "nie" zurückzukehren (Minuten gewartet - kein Ergebnis).

Was ist los? Sollte ich __slots__ unter PyPy verwenden?

Folgendes passiert, wenn ich eine andere Zahl an timeit() :

übergebe %Vor%

Vielen Dank im Voraus.

Beachten Sie, dass das gleiche Verhalten beobachtet wird, wenn ich namedtuple s:

verwende %Vor%     
alecxe 14.04.2014, 18:58
quelle

2 Antworten

11

In jeder der etwa 10.000 Iterationen des Codes timeit wird die Klasse von Grund auf neu erstellt. Das Erstellen von Klassen ist wahrscheinlich keine gut optimierte Operation in PyPy. Schlimmer noch, wenn Sie dies tun, werden Sie wahrscheinlich alle Optimierungen verwerfen, die das JIT von der vorherigen Inkarnation der Klasse erfahren hat. PyPy neigt dazu, langsam zu sein, bis sich der JIT erwärmt hat. Wenn Sie also Dinge tun, die ein wiederholtes Aufwärmen erfordern, wird Ihre Leistung beeinträchtigt.

Die Lösung besteht hier natürlich darin, einfach die Klassendefinition außerhalb des zu vergleichenden Codes zu verschieben.

    
kwatford 14.04.2014, 20:46
quelle
8

Um die Frage im Titel direkt zu beantworten: __slots__ ist sinnlos für (aber tut nicht weh) Leistung in PyPy.

    
Armin Rigo 15.04.2014 07:54
quelle

Tags und Links