【问题标题】:Speed Static Methods vs Class Method速度静态方法与类方法
【发布时间】:2016-09-25 03:22:25
【问题描述】:

类方法和静态方法之间有速度差异吗?我知道不同的用例,但有时我可以完全摆脱类方法并想知道速度差异

【问题讨论】:

    标签: python optimization static-methods class-method


    【解决方案1】:

    测试一下。这将是您碰巧正在运行的任何 Python 解释器(以及所述解释器的版本)的实现细节。对于我的解释器(Python 3.5,Windows,64 位):

    >>> class Foo:
    ...     @classmethod
    ...     def bar(cls):
    ...         pass
    ...     @staticmethod
    ...     def baz():
    ...         pass
    ...
    >>> import timeit
    >>> min(timeit.repeat('Foo.bar()', 'from __main__ import Foo', repeat=5, number=100000))
    0.02093224880448102
    >>> min(timeit.repeat('Foo.baz()', 'from __main__ import Foo', repeat=5, number=100000))
    0.017951558014670965
    >>> min(timeit.repeat('f.bar()', 'from __main__ import Foo; f = Foo()', repeat=5, number=100000))
    0.020720195652103257
    >>> min(timeit.repeat('f.baz()', 'from __main__ import Foo; f = Foo()', repeat=5, number=100000))
    0.017714758216740734
    

    看起来staticmethod 稍微快一些(可能只是因为它根本不需要将参数传递给函数),但我们谈论的是 100,000 次调用的 3 毫秒差异,即纳秒每次通话费用。

    【讨论】:

    • 刚刚运行了相同的测试...静态为 104 ns,非静态为 115 ns。
    • 静态方法更快的事实似乎很直观。我不确定 Python 中的底层机制,但如果它与 C++ 类似,那么与静态函数相比,使用对象调用函数会涉及许多额外的步骤。
    • @DrewBuckley:在 Python 中不会跳过这些步骤(在 Python 中查找是始终动态查找,只是搜索哪些字典的问题)。您会注意到,在类的实例上调用静态或类方法实际上比在类对象本身上调用要快得多。这可能是一个计时工件,但很明显,在调用类本身时没有优化。
    • 跟进“在类的实例上调用静态或类方法实际上比在类对象本身上调用静态或类方法要快得多”。这是如何执行查找的工件。为了启用描述符协议,属性总是首先在类上查找,然后是实例。因此,当您在类的实例上查找它时,它会直接进入类并找到方法。当您在类上查找它时,它首先检查元类。对于非平凡的元类,这可能会引入真正的开销,但对于平凡的元类type,它几乎无法检测到。
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2012-07-14
    • 2018-10-04
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多