用Python中的__slots__缓存资源以节省内存开销的方法

作者:Ben Hoyt 时间:2021-06-21 10:33:40 

我们曾经提到,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,缓存
0
投稿

猜你喜欢

  • python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    2022-09-10 20:01:20
  • 如何用Pytorch搭建一个房价预测模型

    2022-12-16 17:09:21
  • php 字符串中是否包含指定字符串的多种方法

    2023-06-11 20:21:38
  • python连接远程ftp服务器并列出目录下文件的方法

    2023-10-20 10:35:04
  • vue项目配置element-ui容易遇到的坑及解决

    2024-04-29 13:10:25
  • 详解Go语言中的Slice链式操作

    2024-05-22 10:29:05
  • php下pdo的mysql事务处理用法实例

    2023-11-14 17:44:13
  • PHP中重启php-fpm的几种方法汇总

    2023-06-12 21:05:24
  • JavaScript高级程序设计 读书笔记之十 本地对象Date日期

    2024-04-22 22:33:48
  • 3种适用于Python的疯狂秘密武器及原因解析

    2023-02-08 09:10:30
  • Django 返回json数据的实现示例

    2021-03-06 21:33:17
  • 数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法

    2021-05-05 05:36:39
  • 利用 Python 把小伙伴制作成表情包

    2022-08-14 16:57:46
  • python字符串的一些常见实用操作

    2022-05-08 15:53:30
  • Python如何优雅获取本机IP方法

    2021-03-07 15:46:16
  • Oracle 存储过程加密方法

    2009-10-23 18:02:00
  • python 合并文件的具体实例

    2022-03-12 03:18:26
  • 用python生成与调用cntk模型代码演示方法

    2023-04-27 10:55:39
  • Python3+Requests+Excel完整接口自动化测试框架的实现

    2022-12-12 00:19:52
  • Python连接MySQL数据库的简单便捷方法

    2024-01-18 22:46:11
  • asp之家 网络编程 m.aspxhome.com