我发现类的创建比实例化类慢.
>>> 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
Run Code Online (Sandbox Code Playgroud)
是的,创建9000个类需要16秒,并且在后续调用中变得更慢.
还有这个:
>>> T("type('Haha', b, d)", "b = (object, ); d = {}").timeit(9000)
Run Code Online (Sandbox Code Playgroud)
给出类似的结果.
但实例化不会受到影响:
>>> T("Haha()", "class Haha(object): pass").timeit(5000000)
0.8786070346832275
Run Code Online (Sandbox Code Playgroud)
在不到一秒的时间内完成5000000个实例.
是什么让这个创作变得昂贵?
为什么创作过程会变慢?
编辑:
如何重现:
开始一个新的python进程,最初的几个"calc(10000)"在我的机器上给出了0.5的数字.并尝试一些更大的值,calc(100000),它甚至不能以10秒结束,中断它,并且计算(10000),给出15秒.
编辑:
其他事实:
如果你在'calc'变慢后gc.collect(),你可以在开始时获得'正常'的速度,但是后续调用的时间会增加
>>> from a import calc
>>> …Run Code Online (Sandbox Code Playgroud) 我偶然注意到,在Python 2.7和3.5中,从大型数据文件生成类的简单程序运行速度要快得多.我在这里读到,使用"无限精度"整数归咎于简单枚举的减速,但即使我尝试实例化这个类的简单测试,我发现Python 3明显变慢:
class Benchmark(object):
def __init__(self):
self.members = ['a', 'b', 'c', 'd']
def test():
test = Benchmark()
if __name__ == '__main__':
import timeit
print(timeit.timeit("test()", setup="from __main__ import test"))
Run Code Online (Sandbox Code Playgroud)
我想也许这与每个类实例的大小有关,但Python 3实例小于2(56对64)
$python3 benchmarks.py
0.7017288669958361
$python benchmarks.py
0.508942842484
Run Code Online (Sandbox Code Playgroud)
我已尝试过很多关于这个主题的变体,包括在不同的机器上使用3.4,并且仍然得到相同的结果.有什么想法发生了什么?