クラスの作成は、クラスのインスタンス化よりもはるかに遅いことがわかりました。
>>> 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
1秒未満で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