我已按照评论中的建议完成并用于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 微秒
$ python -m timeit -s "import tst" "tst.C()"
1000000 个循环,3 个中最好的:每个循环 0.397 微秒
$ python -m timeit -s "import tst" "tst.D()"
1000000 个循环,3 个中最好的:每个循环 1.09 微秒
$ python -m timeit -s "import tst" "tst.E()"
1000000 个循环,3 个中最好的:每个循环 0.827 微秒
使用函数调用作为基线,结果如下:
- 一个基本的实例化需要多 1.1 倍的时间。
- 添加
__init__
方法将因子增加到 2.6
- 添加一个无操作元类只是稍微贵一点,在 2.7
- 而是添加一个 basic
__new__
,相当于 7.3 的函数调用
- 具有单个子类的类相当于 5.6 函数调用
如果将调用super
替换为其返回值,则对于最后两个结果,您可以减去大约 2。
这应该粗略估计在 CPython 2.7 中耗时的 python 类与 python 函数的比较。