用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 07 Python
python中字符串前面加r的作用
Jun 04 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
python实现装饰器、描述符
Feb 28 Python
python实现感知机线性分类模型示例代码
Jun 02 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
Mar 04 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
PHP编码规范-php coding standard
2007/03/16 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
javascript数组去掉重复
2011/05/12 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
Vue实现日历小插件
2019/06/26 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
flask应用部署到服务器的方法
2019/07/12 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
python模块导入的方法
2019/10/24 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
总结30个CSS3选择器
2017/04/13 HTML / CSS
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
what is the difference between ext2 and ext3
2013/11/03 面试题
中国梦演讲稿开场白
2014/08/28 职场文书
家庭困难证明
2014/10/12 职场文书
客服专员岗位职责
2015/02/10 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
实习单位鉴定意见
2015/06/04 职场文书
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js