用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之??碌某?? target=
Sep 12 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python中Django 后台自定义表单控件
Mar 28 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
python实现聊天小程序
Mar 13 Python
python 批量修改/替换数据的实例
Jul 25 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
在pycharm中显示python画的图方法
Aug 31 Python
如何运行带参数的python脚本
Nov 15 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
如何使用Pytorch搭建模型
Oct 26 Python
如何通过python实现IOU计算代码实例
Nov 02 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实现的功能是显示8条基色色带
2006/10/09 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
sina的lightbox效果。
2007/01/09 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
在Python中进行自动化单元测试的教程
2015/04/15 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
群众路线剖析材料
2014/02/02 职场文书
致200米运动员广播稿
2014/02/06 职场文书
对教师的评语
2014/04/28 职场文书
绿色环保口号
2014/06/12 职场文书
2014年征兵标语
2014/06/20 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
2014年党支部工作总结
2014/11/13 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
开除通知书范本
2015/04/25 职场文书
运动会100米加油稿
2015/07/21 职场文书