python中的空类大小

RaG*_*__M 12 python

我只是想知道python中空类大小背后的基本原理,在C++中,每个人都知道空类的大小总是显示1个字节(据我所知)这让运行时创建独特的对象,而我试图找出python中空类的大小:

class Empty:pass # i hope this will create empty class
Run Code Online (Sandbox Code Playgroud)

当我这样做的时候

import sys
print ("show",sys.getsizeof(Empty)) # i get 1016
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Empty需要这么多1016(字节)?并且它返回的值(1016)是否是一个永远不会像C++一样改变的标准值?我们是否期望从python解释器中进行任何零基类优化?有没有什么办法可以减小am的大小(只是出于好奇心缘故)?

PM *_*ing 14

我假设您运行的是64位版本的Python 3.在32位Python 3.6(在Linux上),您的代码打印出来show 508.

但是,这是类对象本身的大小,它从基object类继承了很多东西.如果您改为获得类的实例大小,结果会小得多.在我的系统上,

import sys

class Empty(object):
    pass

print("show", sys.getsizeof(Empty()))
Run Code Online (Sandbox Code Playgroud)

产量

show 28
Run Code Online (Sandbox Code Playgroud)

这是一个很多更紧凑.:)

FWIW,关于Python 2.6.6,sys.getsizeof(Empty)返回448为新式类,和一个老样式类(一个不继承区区44 object).sys.getsizeof(Empty())对于新式类实例返回28,对于旧式实例返回32.


您可以使用减少实例的大小 __slots__

可以为此类变量分配字符串,可迭代或具有实例使用的变量名称的字符串序列.__slots__为声明的变量保留空间,并阻止自动创建__dict____weakref__为每个实例创建.

import sys

class Empty(object):
    __slots__ = []

print("show", sys.getsizeof(Empty()))
Run Code Online (Sandbox Code Playgroud)

产量

show 8
Run Code Online (Sandbox Code Playgroud)

请阅读文档以了解如何使用此功能.