Я обнаружил, что создание класса происходит медленнее, чем создание экземпляра класса.
>>> 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 экземпляров менее чем за 1 секунду.
Что делает создание дорогостоящим?
И почему процесс создания становится медленнее?
EDIT:
Как воспроизвести:
запустите новый процесс python, начальные несколько "calc (10000)" дают число 0.5 на моей машине. И попробуйте несколько более крупных значений, calc (100000), он не может закончиться даже через 10 секунд, прервать его и calc (10000), дает 15 секунд.
EDIT:
Дополнительный факт:
Если 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