用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内存管理方式和垃圾回收算法解析
Nov 11 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
将python代码和注释分离的方法
Apr 21 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
Python 实现自动导入缺失的库
Oct 29 Python
Python实现数值积分方式
Nov 20 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
python3爬取各类天气信息
2018/02/24 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
毕业自我鉴定书
2014/03/24 职场文书
家长会主持词
2014/03/26 职场文书
十佳家长事迹材料
2014/08/26 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
2014年文秘工作总结
2014/11/25 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
叶问观后感
2015/06/15 职场文书
教师听课学习心得体会
2016/01/15 职场文书
高一作文之乐趣
2019/11/21 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python