用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中lambda与def用法对比实例分析
Apr 30 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
Python selenium如何设置等待时间
Sep 15 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
基于python的字节编译详解
Sep 20 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
python 实现按对象传值
Dec 26 Python
Python list运算操作代码实例解析
Jan 20 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
Python selenium模块实现定位过程解析
Jul 09 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
抓取YAHOO股票报价的类
2009/05/15 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python运算符重载用法实例
2015/05/28 Python
Python人脸识别初探
2017/12/21 Python
Python装饰器原理与用法分析
2018/04/30 Python
TensorFlow Session会话控制&Variable变量详解
2018/07/30 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
jupyter notebook清除输出方式
2020/04/10 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
刚毕业大学生自荐信范文
2014/02/20 职场文书
先进单位事迹材料
2014/12/25 职场文书
小学生表扬稿范文
2015/05/05 职场文书
电力工程合作意向书
2015/05/11 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
2016年母亲节寄语
2015/12/04 职场文书
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers