天天看点

用Python的 __slots__ 节省9G内存

这是其中一个服务器在部署代码前后的截图:

用Python的 __slots__ 节省9G内存

physical-memory-usage-history

我们alloc了大约一百万个类似如下class的实例:

默认情况下,python用一个dict来存储对象实例的属性。这在一般情况下还不错,而且非常灵活,乃至你在运行时可以随意设置新的属性。

但是,对一些在”编译”前就知道该有几个固定属性的小class来说,这个dict就有点浪费内存了。而当你把这个小浪费乘上一百万,那可就大不同了。在python中,你可以在class中设置__slots__,它是一个包含这些固定的属性名的list。这样python就不会再使用dict,而且只分配这些属性的空间。

你还可以用collections.namedtuple,它允许访问参数,但只占用一个tuple的空间。这跟__slots__类似。不过我总觉得继承一个namedtuple类很奇怪。另外,如果你需要自定义初始化,你应该重载__new__而不是__init__。

警告:不要贸然进行这个优化,把它用在所有地方。这种做法不利于代码维护,而且只有当你有数以千计的实例的时候才会有明显效果。

原文发布时间为:2013-12-03

本文来自云栖社区合作伙伴“linux中国”