我只是想知道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)
请阅读文档以了解如何使用此功能.
| 归档时间: |
|
| 查看次数: |
1678 次 |
| 最近记录: |