用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二分法搜索算法实例分析
May 11 Python
python 队列详解及实例代码
Oct 18 Python
python opencv之分水岭算法示例
Feb 24 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
python性能测量工具cProfile使用解析
Sep 26 Python
python opencv图片编码为h264文件的实例
Dec 12 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
基于FME使用Python过程图解
May 13 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
SpringBoot首页设置解析(推荐)
Feb 11 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
php smarty的预保留变量总结
2008/12/04 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
yii中widget的用法
2014/12/03 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
一句话JavaScript表单验证代码
2009/08/02 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
详解如何运行vue项目
2019/04/15 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
Python3.4解释器用法简单示例
2019/03/22 Python
python的scipy实现插值的示例代码
2019/11/12 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
竞聘书模板
2014/03/31 职场文书
公司请假条范文
2014/04/11 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
教师工作失职检讨书
2014/09/18 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
Python 制作自动化翻译工具
2021/04/25 Python