Noa*_*oah 4 python optimization
我的假设是,即使一个函数什么也不做,它仍然应该占用内存,但是在下面,foo如果Foo有一个额外的函数,为什么不占用更多的内存呢?
class Foo():
def __init__(self):
pass
def why_does_this_not_use_memory(self):
pass
class Bar():
def __init__(self):
pass
import sys
foo = Foo()
print(sys.getsizeof(foo)) # 56
bar = Bar()
print(sys.getsizeof(bar)) # 56
Run Code Online (Sandbox Code Playgroud)
首先,方法是根据对象的类型而不是对象本身存储的。
但是,您会发现,如果您要求班级人数,它们也相等。
>>> sys.getsizeof(Foo)
1064
>>> sys.getsizeof(Bar)
1064
Run Code Online (Sandbox Code Playgroud)
每个类对象都有一个__dict__属性,该属性存储对其方法和其他属性的引用。
>>> Foo.__dict__['why_does_this_not_use_take_memory']
<function Foo.why_does_this_not_use_take_memory at 0x103609ef0>
Run Code Online (Sandbox Code Playgroud)
但是,sys.getsizeof不会递归于此dict;它仅返回class对象本身使用的内存,不包括您可以通过及其属性访问的对象class。
每个方法都是一个类属性。通常,无需过多地描述描述符协议,foo.why_does_this_not_use_take_memory实际上就像是
Foo.why_does_this_not_use_take_memory.__get__(foo, Foo)
Run Code Online (Sandbox Code Playgroud)
也就是说,function检索了-valued属性,但随后__get__调用了其方法以返回method特定于的对象foo。从method本质上讲,它只是函数的包装,该函数在被调用时将传递foo其自身的参数Foo.why_does_this_not_use_take_memory(self绑定到foo)。