我有几个在其中使用self
的实例方法,但仅限于几个地方。
因此,我可以直接从我使用参数调用这些方法的位置传递这些值,并将方法创建为staticmethod
。这会消耗更少的内存吗?
答案 0 :(得分:6)
你在这里进行微观优化没有任何好处。
是的,常规方法涉及一个新的method
对象,它是为处理函数和实例之间的绑定而创建的,但这只是一点内存(2个指针加上一些Python元数据)仅在调用的持续时间或存储绑定的方法。 staticmethod
对象不会创建新的方法对象,但会因staticmethod
对象所需的相同内存量而偏移:
>>> import sys
>>> class Foo:
... def bar(self): pass
... @staticmethod
... def staticbar(): pass
...
>>> sys.getsizeof(Foo().bar) # bound method object size
64
>>> sys.getsizeof(Foo.__dict__['staticbar']) # staticmethod size
56
因此,使用staticmethod
对象可以节省8个字节(在Mac OS X上,在另一个操作系统上,字节数可能略有不同),但您通常保持绑定方法(你使用instance.method()
创建方法对象,然后在调用后再次丢弃它。
因此,除非您存储大量绑定方法,否则无法通过在任何地方手动传递实例来证明您的代码不可读是不合适的。