__slots__作用

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

__slots__节省内存的原理

class Measurement:

def __init__(self, x, y, value):

self.x = x

self.y = y

self.val = value

m1 = Measurement(1, 2, "Happy")

m2 = Measurement(7, 10, "Crazy")

m2.other = True

其实,对类的变量值进行初始化,底层是通过一个指针指向__dict__(里面包含潜在的字段名和字段值)。举个例子,上面的程序底层实现过程如下:

我们也可以通过程序查看这一底层形式:

```

print(m1.__dict__) # {'x': 1, 'y': 2, 'val': 'Happy'}

print(m2.__dict__) # {'x': 7, 'y': 10, 'other': True, 'val': 'Crazy'}

```

这就是python自定义变量底层的一个基本实现。通过对这一底层理解,我们就会知道,如果我们的实例有数百万个,那么底层会有相应数百万个字典拥有相同的key值(知识value值不同),这时非常耗内存的,这时候__slots__就发挥它的作用了。

通过__slots__,我们可以稍微调整一下类,以改变类中字段的存储方式,废弃原来那种耗费内存的1对1重复的字典分配方式。具体如下:

class Measurement:

__slots__ = ['x', 'y', 'val']

def __init__(self, x, y, value):

self.x = x

self.y = y

self.val = value

这样我们底层的实现就会变为如下方式:

我们可以看出,现在字段名是与Measurement类这个类型相关联,而不是原来的与相应的实例1对1的关联。而字段值与原来的方式无差别,因为毕竟各个实例的字段名一样,可以统一存放,而字段值并不都是一样,当然对于字段值也一样的我们也统一存储(因为底层字典都是与类这个类型关联,而不是与每个实例的__dict__关联)。但对于数据量庞大的情况(数百万级以上),能够非常显著的节省内存空间(25.5GB -> 16.2GB)。

以上就是__slots__能够节省内存的原理,主要还是要搞清楚python的类变量初始化的底层操作是通过字典存储后相关联这一方式进行的,__slots__只是改变了字典key,value与实例相关联的方式,可以总结如下:

默认变量实例化方法:底层实例和字典是一对一的关系

加入__slots__后:底层实例和字典是多对一的关系(重复的部分)。

python内存技巧_使用__slots__节省python内存技巧相关推荐

  1. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  2. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  3. 通过Python的__slots__节省9GB内存

    我们之前提到过,Oyster.com基于Python的web服务器缓存了大量Python字典(dicts)(哈希表(hash tables))的静态内容.好啦,我们最近使用一行代码--在我们的Imag ...

  4. python面试技巧_经典7大Python面试题!看完考官竟然给了我30k的薪资

    Python面试(一)之交换变量值 平时时不时会面面实习生,大多数的同学在学校里都已经掌握了Python.面试的时候要求同学们实现一个简单的函数,交换两个变量的值,大多数的同学给出的都是如下的答案 实 ...

  5. python内存泄漏_诊断和修复Python中的内存泄漏

    python内存泄漏 Fugue uses Python extensively throughout the Conductor and in our support tools, due to i ...

  6. python 单例模式内存泄露_彻底搞懂Java内存泄露

    之前一直在简书写作,第一次发布到SF上来,也是第一次使用SF,后面会尽量同步到SF,更多文章请关注: 简书 编程之乐 转载请注明出处:谢谢! Java内存回收方式 Java判断对象是否可以回收使用的而 ...

  7. python循环代码优化技巧_记一次优化python循环代码逻辑的过程

    问题描述: 一个含有30W元素的列表A,列表的元素都是字符串,现在要循环10W次,每次都要判断一下B字符串是否存在这个A列表里面,有什么优化策略吗? 问题现状: 如果用普通的逻辑来写, 程序会类似下面 ...

  8. python会不会内存泄露_记一次python 内存泄漏问题及解决过程 python 嵌套读取文件 内存泄露...

    如何解决Python2的内存泄漏问题 python本身不会造成内存泄露,如果用的C/C++写的模块(包),如果处理不好,可能会造成内存泄露,但是也是C/C++的模块造成的 欢迎来到四十五资源网,pyt ...

  9. python 核心编程_【02】Python核心编程 (全)

    一.浅拷贝和深拷贝 1.浅拷贝 是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容.相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a=b. 2.深拷 ...

最新文章

  1. C\C++网络编程总结
  2. TypeScript Type Innference(类型推断)
  3. (81)FPGA复位激励(task)
  4. 【重定向 return “redirect:/***“的作用 】
  5. 一个特牛的日期时间判断正则表达式
  6. Tensor flow 实战Google深度学习框架 笔记摘要Pthree(二)
  7. VS+VSS代码管理
  8. windows上java调用gdal.jar报错
  9. SQL Server2005如何进行数据库定期备份
  10. 2019-06-30中国裁判文书网数据爬虫更新,PYTHON
  11. Lrc2Srt字幕转换精灵
  12. [技巧]QQ密技(一)
  13. 大家好,我是数学家!来抢诺贝尔奖了!
  14. python读取千万级数据库数据类型_解决python读取几千万行的大表内存问题
  15. style type=text/css中的type=text/css到底是什么意思
  16. 汇编--call和ret指令
  17. [离散数学]命题逻辑P_5:命题公式分类和等价
  18. 用递归的方式分析白色相簿2 coda篇各结局概率
  19. [2021-11-02] VMware 共享文件夹不显示的问题
  20. OpenCV实现远程视频监控与运动目标检测

热门文章

  1. 纯后处理的volumetric light
  2. OS X上搭建distcc使用XCode进行分布式编译
  3. HLSL编译工具—FXC
  4. Linux就该这么学第0章 咱们先来谈谈学习方法和红帽系统。
  5. css实现文本超出宽度省略号显示
  6. Puppet安装部署篇(一)
  7. ikvm.net简介
  8. 网络资源(1) - Hadoop视频
  9. PHP apache2.2 mysql 的安装
  10. 同一工作组无法访问_工作组、AD、域、DC...