【问题标题】:Python static method vs. Java static methodPython 静态方法与 Java 静态方法
【发布时间】:2018-10-04 04:41:36
【问题描述】:

在 Java 中,我们只将静态方法的一份副本存储到内存中,我们可以一遍又一遍地调用它。这是为了性能和节省空间。

以前,有人在工作中声称 Python 中的静态函数与 Java 中的工作方式不同,is this correct?

也有人声称,每次我们在调用 Python 的静态方法时,Python Interpreter 仍然需要花时间先实例化一个对象。 Is this correct?

class A(object):
     @staticmethod
     def static_1():
         print 'i am static'

【问题讨论】:

  • 不应比常规方法慢。
  • @staticmethod 是一个装饰器,意味着方法被包装了。额外的函数调用(如果有的话)可能会有一些开销,尽管可能并不重要(取决于您对重要的定义)。

标签: java python static-methods python-internals


【解决方案1】:

java静态方法的Python方法是@classmethod.

【讨论】:

  • 有人跟我说 Python 中的静态方法很慢,我一直在寻找解释器级别的答案。
【解决方案2】:

访问 Python 静态方法不涉及创建新对象。 Python 只返回原始函数对象。

(访问非静态方法确实需要创建一个新的方法对象,但这很便宜。特别是,它只将函数的引用和self的引用捆绑在一起;它不涉及复制函数.)

【讨论】:

  • 另外,即使是“复制函数”也会很便宜。一个函数只是一个带有一些元组和一个代码对象的结构,所以它基本上是复制(对于 CPython 来说是递增)一些指向不可变对象的指针。许多 Python 新手认为它必须涉及重新编译源代码或其他东西……
【解决方案3】:

Python 语言和特定的 Python 实现之间存在差异。

此外,几乎所有语言在内存中只存储一个方法副本。这适用于所有静态、类和常规方法。您提到的节省来自不需要将指针传递给 Python 中的“self”或 Java 中的“this”。少传递一个参数可以大大节省从最内层长时间运行循环中调用的方法。

至于存储方法本身。像 PyPi 这样的实现会不断地执行 JIT 来将方法编译成机器代码。他们根据有关方法执行方式的更新统计数据不断重新编译。我相信类似的行为也发生在 Java 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多