用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 合并文件的具体实例
Aug 08 Python
Python正则捕获操作示例
Aug 19 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
Python多重继承的方法解析执行顺序实例分析
May 26 Python
flask框架路由常用定义方式总结
Jul 23 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 Python
Python实现简单的猜单词小游戏
Oct 28 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
python中二分查找法的实现方法
Dec 06 Python
如何在Python项目中引入日志
May 31 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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使用者状态管理功能的应用
2006/10/09 PHP
smarty内置函数section的用法
2015/01/22 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
简单介绍Python中的几种数据类型
2016/01/02 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
Pytorch中.new()的作用详解
2020/02/18 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
英国家用电器购物网站:Hughes
2018/02/23 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
关于迟到的检讨书
2014/01/26 职场文书
银行求职自荐信
2014/06/30 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
学校创先争优活动总结
2014/08/28 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
实习生辞职信范文
2015/03/02 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers