Почему создание класса в Python происходит намного медленнее, чем создание экземпляра класса?

Я обнаружил, что создание класса происходит намного медленнее, чем создание экземпляра класса.

>>> from timeit import Timer as T
>>> def calc(n):
...     return T("class Haha(object): pass").timeit(n)

<<After several these 'calc' things, at least one of them have a big number, eg. 100000>>

>>> calc(9000)
15.947055101394653
>>> calc(9000)
17.39099097251892
>>> calc(9000)
18.824054956436157
>>> calc(9000)
20.33335590362549

Да, создание 9000 классов заняло 16 секунд, и становится еще медленнее в последующих вызовах.

И это:

>>> T("type('Haha', b, d)", "b = (object, ); d = {}").timeit(9000)

дает аналогичные результаты.

Но реализация не страдает:

>>> T("Haha()", "class Haha(object): pass").timeit(5000000)
0.8786070346832275

5000000 экземпляров менее чем за одну секунду

Что делает создание таким дорогим?

И почему процесс создания становится медленнее?

РЕДАКТИРОВАТЬ:

Как воспроизвести:

запустить новый процесс python, начальные несколько "calc(10000)" дают число 0,5 на моей машине. И попробуйте некоторые большие значения, calc (100000), это не может закончиться даже через 10 секунд, прервите его, и calc (10000) дает 15 секунд.

РЕДАКТИРОВАТЬ:

Дополнительный факт :

Если gc.collect() после того, как 'calc' стал медленным, вы можете получить "нормальную" скорость в начале, но время будет увеличиваться при последующих вызовах

>>> from a import calc
>>> calc(10000)
0.4673938751220703
>>> calc(10000)
0.4300072193145752
>>> calc(10000)
0.4270968437194824
>>> calc(10000)
0.42754602432250977
>>> calc(10000)
0.4344758987426758
>>> calc(100000)
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "a.py", line 3, in calc
    return T("class Haha(object): pass").timeit(n)
  File "/usr/lib/python2.7/timeit.py", line 194, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
KeyboardInterrupt
>>> import gc
>>> gc.collect()
234204
>>> calc(10000)
0.4237039089202881
>>> calc(10000)
1.5998330116271973
>>> calc(10000)
4.136359930038452
>>> calc(10000)
6.625348806381226
28
задан Cody C 9 April 2012 в 16:20
поделиться