我发现一个类的创建方式比类的实例化更慢。
>>> from timeit import Timer as T
>>> def calc(n):
... return T("class Haha(object): pass").timeit(n)
<>
>>> 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秒内。
什么使创作这昂贵?
为什么创建过程变得更慢?
编辑:
如何复制:
开始一个新的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 "", line 1, in
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 "", 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