コメントで提案されているとおりに実行timeit
し、これらのテストケースで使用しました:
def a():
pass
class A(object):
pass
class B(object):
def __init__(self):
pass
class NOPType(type):
pass
class C(object):
__metaclass__ = NOPType
def __init__(self):
pass
class D(object):
def __new__(cls, *args, **kwargs):
return super(D, cls).__new__(cls)
def __init__(self):
pass
class E(A):
def __init__(self):
super(E, self).__init__()
試験結果:
$ python -m timeit -s "import tst" "tst.a()"
10000000 ループ、ベストオブ 3: ループあたり 0.149 マイクロ秒
$ python -m timeit -s "import tst" "tst.A()"
10000000 ループ、ベストオブ 3: ループあたり 0.169 マイクロ秒
$ python -m timeit -s "import tst" "tst.B()"
1000000 ループ、ベストオブ 3: ループあたり 0.384 usec
$ python -m timeit -s "import tst" "tst.C()"
1000000 ループ、ベストオブ 3: ループごとに 0.397 usec
$ python -m timeit -s "import tst" "tst.D()"
1000000 ループ、ベストオブ 3: ループあたり 1.09 マイクロ秒
$ python -m timeit -s "import tst" "tst.E()"
1000000 ループ、ベストオブ 3: ループごとに 0.827 usec
関数呼び出しをベースラインとして使用すると、次の結果が得られます。
- 基本的なインスタンス化には 1.1 倍の時間がかかります。
- メソッドを追加する
__init__
と、係数が 2.6 に増加します
- no-op メタクラスの追加は、2.7 で、ほんの少し高価です。
- 代わりに basic を追加する
__new__
と、7.3 関数呼び出しと同等になります。
- 単一のサブクラスを持つクラスは、5.6 関数呼び出しと同等です
super
最後の 2 つの結果については、呼び出しをその戻り値に置き換えると、約 2 を引くことができます。
これにより、CPython 2.7 で、時間のかかる python クラスと python 関数を比較する方法の概算が得られるはずです。