用Python中的__slots__缓存资源以节省内存开销的方法

 更新时间:2015年04月02日 17:12:14   作者:Ben Hoyt  
这篇文章主要介绍了用Python中的__slots__通过缓存资源的方式以节省内存开销的方法,且示例代码非常简单,需要的朋友可以参考下

我们曾经提到,Oyster.com的Python web服务器怎样利用一个巨大的Python dicts(hash table),缓存大量的静态资源。我们最近在Image类中,用仅仅一行__slots__代码,让每个6G内存占用的服务进程(共4个),省出超过2G来。

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

201542170958351.jpg (862×280)

我们alloc了大约一百万个类似如下class的实例:
 
class Image(object):
    def __init__(self, id, caption, url):
        self.id = id
        self.caption = caption
        self.url = url
        self._setup()
 
    # ... other methods ...

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

但是,对一些在”编译”前就知道该有几个固定属性的小class来说,这个dict就有点浪费内存了。而当你把这个小浪费乘上一百万,那可就大不同了。在Python中,你可以在class中设置__slots__,它是一个包含这些固定的属性名的list。这样Python就不会再使用dict,而且只分配这些属性的空间。
 
class Image(object):
    __slots__ = ['id', 'caption', 'url']
 
    def __init__(self, id, caption, url):
        self.id = id
        self.caption = caption
        self.url = url
        self._setup()
 
    # ... other methods ...

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

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

译注:作者在评论中关于”不利于代码维护“的说法:

webreac:我觉得__slots__关键字不只是速度优化(注:这里应该是内存优化),也是类字段名的一个可靠”文档“。这有利于代码维护。为什么你觉得它不好?

Ben Hoyt(作者):有趣的说法——我不确定应不应该把__slots__作为文档。不过的确是不错的注意。我之前这么说的原因是,你需要对字段名”定义“两次(不够DRY)。namedtuple也类似。

相关文章

  • 详解OpenCV-Python Bindings如何生成

    详解OpenCV-Python Bindings如何生成

    这篇文章主要为大家介绍了OpenCV-Python Bindings如何生成过程解析以及如何将新的OpenCV模块扩展到Python,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 关于Python下的Matlab函数对应关系(Numpy)

    关于Python下的Matlab函数对应关系(Numpy)

    这篇文章主要介绍了关于Python下的Matlab函数对应关系(Numpy),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Matlab求解数组中的最大值及它所在的具体位置

    Matlab求解数组中的最大值及它所在的具体位置

    这篇文章主要介绍了Matlab求解数组中的最大值及它所在的具体位置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Pandas数据分析的一些常用小技巧

    Pandas数据分析的一些常用小技巧

    这篇文章主要介绍了Pandas数据分析的一些常用小技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • python2与python3共存问题的解决方法

    python2与python3共存问题的解决方法

    这篇文章主要为大家详细介绍了python2与python3共存问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Python中判断输入是否为数字的实现代码

    Python中判断输入是否为数字的实现代码

    这篇文章主要介绍了Python中判断输入是否为数字的实现代码,需要的朋友可以参考下
    2018-05-05
  • 基于python时间处理方法(详解)

    基于python时间处理方法(详解)

    下面小编就为大家带来一篇基于python时间处理方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Python分析最近大火的网剧《隐秘的角落》

    Python分析最近大火的网剧《隐秘的角落》

    这篇文章主要介绍了Python分析最近大火的网剧《隐秘的角落》,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Python Numpy库的超详细教程

    Python Numpy库的超详细教程

    Numpy库是Python中的一个科学计算库,本文主要介绍了ndarray的基本操作、 ndarray运算等各种Numpy库的超详细教程,需要的朋友可以参考下
    2022-04-04
  • python中的布隆过滤器用法及原理详解

    python中的布隆过滤器用法及原理详解

    这篇文章主要介绍了python中的布隆过滤器用法及原理详解,布隆过滤器是一种概率空间高效的数据结构,它与hashmap非常相似,用于检索一个元素是否在一个集合中。它在检索元素是否存在时,能很好地取舍空间使用率与误报比例,需要的朋友可以参考下
    2023-07-07

最新评论