我们之前提到过,Oyster.com基于Python的web服务器缓存了大量Python字典(dicts)(哈希表(hash tables))的静态内容。好啦,我们最近使用一行代码——在我们的Image类中使用__slots__,使得每个6GB的服务器在处理中都节省超过2GB内存。

这是使用前和使用这一改变后再部署的RAM用量截图:

我们大概分配了一百万个下面这个类的实例:

pythonclass Image(object):def __init__(self, id, caption, url):self.id = idself.caption = captionself.url = urlself._setup()# ... other methods ...

Python默认使用一个字典来存储一个对象的实例属性。一般说来,这很不错,而且还支持完全动态性,比如在运行时设置任意新的属性。

然而,对于一个“小类”来说,有一些在“编译时”就已经固定的属性,这样一来,字典实际上是在消耗内存,在创建一百万个这样的类的时候,消耗更是显而易见。你可以跟Python说不使用字典,而是仅为某些固定的属性分配空间,可以通过在类中将__slots__设置为一个固定列表来实现这个效果:

pythonclass Image(object):__slots__ = ['id', 'caption', 'url']def __init__(self, id, caption, url):self.id = idself.caption = captionself.url = urlself._setup()# ... other methods ...

需要特别说到的是,你也可以使用 collections.namedtuple,它仅限定元组空间(the space of a tuple)中的属性能够访问,这与在类中使用__slots__相似。但是,在我看来,从一个命名元组(namedtuple)类中继承令人感到怪异。并且,如果你想自定义初始化器(initializer),你还必须重写__new__而不是用__init__

警告:别过早优化或者将此应用在所有场景!这个方法并不利于代码维护,而且在你真的有成千个实例的时候才有显著效果。

来自:Saving 9 GB of RAM with Python’s __slots__

通过Python的__slots__节省9GB内存相关推荐

  1. python内存技巧_使用__slots__节省python内存技巧

    __slots__作用 __slots__有一个作用是:限制类实例绑定的属性,但是它有一个更重要的作用就是节省内存,当然更适用于数据量大的情况(万量级以上). __slots__节省内存的原理 cla ...

  2. python的`__slots__`属性

    1. 引言 我们先看一个问题: 对象(通过类实例化后的对象)如何储存自己的属性? 1.1. 默认情况下:对象如何储存自己的属性 为了说明这个问题, 我们先在交互式模式中做一个简单的测试: >&g ...

  3. 独家|测量、建议、快速上手!你所使用的Python对象占用了多少内存?(附代码)...

    作者:Gigi Sayfan 翻译:吴振东 校对:吴金笛 本文约3300字,建议阅读10分钟. 本文将介绍多种Python对象分别所占用的内存,并解释所选择的测量方法和函数,为节省内存提供建议. Py ...

  4. Python中__slots__的使用

    摘要 当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性, 例如,class Foo(object): __slots__ = ['foo'].这样做带来以下优点: 更快的属性 ...

  5. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

  6. python有内存处理模块吗_使用Python多处理的高内存使用

    我已经看到一些使用Python多处理模块的内存使用的帖子.但问题似乎并不能解决我在这里遇到的问题.我发表了我的分析,希望有人能帮助我. 问题 我正在使用多进程并行执行任务,我注意到,工作进程的内存消耗 ...

  7. 当退出python时是否释放全部内存_Python面试题:高级特性考察

    1.函数装饰器有什么作用?请列举说明? 答: 装饰器就是一个函数,它可以在不需要做任何代码变动的前提下给一个函数增加额外功能,启动装饰的效果. 它经常用于有切面需求的场景,比如:插入日志.性能测试.事 ...

  8. 当退出python时是否释放全部内存_python 关于高级特性的问题

    1.函数装饰器有什么作用?请列举说明? 2. Python 垃圾回收机制? 3. 魔法函数 _call_怎么使用? 4. 如何判断一个对象是函数还是方法? 5. @classmethod 和 @sta ...

  9. python 指针_C++的动态内存:C++的指针

    在C++里,指针(pointer)变量被用来存储内存地址.C++要求使用特定的类型来定义指针.这个类型被用来指示需要如何去解释内存地址里的数据.我们已经知道,在计算机的内部,内存存储的是1和0,而C+ ...

最新文章

  1. C语言竟成TIOBE年度编程语言候选!苹果iPhone 7卖得最好!
  2. android流量控制的实现,Android系统中P2P应用数据包捕获及流量控制研究
  3. mysql多图怎么同时上传,小程序如何同时上传多张图片?
  4. ios 跳转到某 app 的评价区域、由某应用跳转到其他应用
  5. html中红色星号,谨慎使用CSS中的星号(*)通配符
  6. 我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例
  7. C++ opengl 绘制三角形带
  8. Sql Server系列:键和约束
  9. mysql 常用函数和关键字
  10. 2018年最新税收分类编码_如何免费在线进行2018年税收
  11. Spring文件中的xsd文件
  12. Transformer靠什么基因,得以闯入CV界秒杀CNN?
  13. UART BootROM
  14. 免费音乐素材网站推荐 视频剪辑自媒体运营必备
  15. android gatekeeper(locksetting密码锁)学习这一篇就够了
  16. symmetric tree java_Symmetric Tree对称树
  17. 微信史诗级更新:60秒长语音有救了!
  18. OpenCvSharp 给黑白图像添加自定义的伪彩色
  19. 关于Trigger的介绍
  20. win10共享计算机win7,win10共享文件夹给win7的方法是什么_win10给win7共享文件夹的方法...

热门文章

  1. 李剑锋:意识科学就在身边
  2. 硅片行业:过剩背景下的寡头市场
  3. “金三银四”跳槽需谨慎(送福利礼包)!
  4. 入职大厂,我容易吗?
  5. 羡慕嫉妒!看了腾讯月收入 8 万 的支出账单不恨了 | 每日趣闻
  6. 2025 年中国数据总量预估全球第一,程序员必备的一门数据课!
  7. 本周六定位上海!解析百度文心(ERNIE)如何助力快速定制企业级NLP模型
  8. 腾讯云发布微瓴开放平台LinkBase,助力智慧建筑产业生态全面升级
  9. 以太坊创始人V 神:普通人看见现在,天才看见未来
  10. Js 拦截全局ajax请求