我发现创建一个类比实例化一个类要慢得多。
>>> 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 秒。
编辑:
附加事实:
如果你在 'calc' 变慢后使用 gc.collect() ,你可以在开始时获得 'normal' 速度,但在随后的调用中时间会增加
>>> 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