我发现创建类比实例化类要慢得多。
>>> 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() ,你可以在开始时获得'正常'的速度,但在随后的调用中时间会增加
>>> 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
最佳答案
这可能会给你直觉:
>>> class Haha(object): pass
...
>>> sys.getsizeof(Haha)
904
>>> sys.getsizeof(Haha())
64
类对象的结构比该类的实例多复杂和昂贵。
关于python - 为什么在 Python 中创建一个类比实例化一个类要慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072428/