Использование __slots__ под PyPy

У меня есть этот простой код, который помог мне измерить, как выполняются классы с __slots__ (взяты отсюда ):

 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) 

Если я запустил его через python2.7 – я бы получил что-то около 6 секунд – хорошо, это действительно быстрее (а также более эффективно с памятью), чем без слотов.

Но если я запустил код под PyPy (используя 2.2.1 – 64 бит для Mac OS / X), он начнет использовать 100% CPU и «никогда» не вернется (ждал минуты – никакого результата).

Что происходит? Должен ли я использовать __slots__ под PyPy?

Вот что произойдет, если я timeit() другое число timeit() :

 timeit(10) - 0.067s timeit(100) - 0.5s timeit(1000) - 19.5s timeit(10000) - ? (probably more than a Game of Thrones episode) 

Заранее спасибо.


Обратите внимание, что такое же поведение наблюдается, если я использую namedtuple s:

 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) 

    2 Solutions collect form web for “Использование __slots__ под PyPy”

    В каждой из 10000 и так timeit кода timeit класс воссоздается с нуля. Создание классов, вероятно, не является оптимизированной операцией в PyPy; Хуже того, это, вероятно, отбросит все оптимизации, которые JIT узнал о предыдущем воплощении класса. PyPy имеет тенденцию быть медленным до тех пор, пока JIT не разогреется, поэтому действия, требующие многократного прогрева, убьют вашу производительность.

    Разумеется, решение состоит в том, чтобы просто переместить определение класса за пределы проверяемого кода.

    Чтобы прямо ответить на вопрос в названии: __slots__ бессмысленно (но не повредит) производительность в PyPy.

    Python - лучший язык программирования в мире.