Ich habe diese einfache Code, der mich zu messen dazu beigetragen, wie Klassen mit __slots__
durchführen (aus here genommen):Mit __slots__ unter PyPy
import timeit
def test_slots():
class Obj(object):
__slots__ = ('i', 'l')
def __init__(self, i):
self.i = i
self.l = []
for i in xrange(1000):
Obj(i)
print timeit.Timer('test_slots()', 'from __main__ import test_slots').timeit(10000)
Wenn ich es über python2.7 laufen - ich würde 6 etwas umgehen Sekunden - 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), beginnt es zu 100% CPU verwenden und "nie" zurück (Minuten gewartet - kein Ergebnis).
Was ist los? Sollte ich __slots__
unter PyPy verwenden?
Hier ist, was passiert, wenn ich andere Nummer timeit()
passieren:
timeit(10) - 0.067s
timeit(100) - 0.5s
timeit(1000) - 19.5s
timeit(10000) - ? (probably more than a Game of Thrones episode)
Vielen Dank im Voraus.
Beachten Sie, dass das gleiche Verhalten beobachtet wird, wenn ich namedtuple
s verwenden:
import collections
import timeit
def test_namedtuples():
Obj = collections.namedtuple('Obj', 'i l')
for i in xrange(1000):
Obj(i, [])
print timeit.Timer('test_namedtuples()', 'from __main__ import test_namedtuples').timeit(10000)
Unabhängig von allem anderen, ein Programm, das entweder endlos oder 60x unter CPython läuft, ist ein Bug und sollte mit den PyPy-Jungs ausgelöst werden. – delnan
Ich würde tatsächlich erwarten, dass die '__slots__'-Version langsamer ist, da diese Klassen für den Speicherplatz optimiert sind und nicht für das Abrufen von Attributen optimiert sind. – wheaties
@wheaties yup, aber der Benchmark zeigt, dass 'slots' und' namedtuples' auch schneller sind: http://stackoverflow.com/questions/1336791/dictionary-vs-object-which-is-more-efficient-and-why/1336890 # 1336890 – alecxe