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


Posted in Python onApril 02, 2015

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

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

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

我们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也类似。

Python 相关文章推荐
简明 Python 基础学习教程
Feb 08 Python
Python抓取百度查询结果的方法
Jul 08 Python
Python注释详解
Jun 01 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
对python中的装包与解包实例详解
Aug 24 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python查询MySQL将数据写入Excel
Oct 29 Python
python中的列表和元组区别分析
Dec 30 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
用Python的线程来解决生产者消费问题的示例
Apr 02 #Python
用实例分析Python中method的参数传递过程
Apr 02 #Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 #Python
使用Python脚本对Linux服务器进行监控的教程
Apr 02 #Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 #Python
用Python的Django框架完成视频处理任务的教程
Apr 02 #Python
用map函数来完成Python并行任务的简单示例
Apr 02 #Python
You might like
967 个函式
2006/10/09 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
php中的动态调用实例分析
2015/01/07 PHP
jquery 表单取值常用代码
2009/12/22 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
原生js实现日期联动
2015/01/12 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
如何搜索查找并解决Django相关的问题
2014/06/30 Python
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
python Django模板的使用方法
2016/01/14 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
简单实现python聊天程序
2018/04/01 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
师德演讲稿范文
2014/05/06 职场文书
毕业论文致谢范文
2015/05/14 职场文书
公司员工培训管理制度
2015/08/04 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA