Python的数据缓存


python 的内置数据类型,数值型,字符串,列表,字典等都会有自己的对象缓存池,

这样做的好处是,避免了频繁的申请内存,释放内存,这样会极大的降低应用程序的运行速度,还会造成大量的内存碎片。因此提供对象缓存机制是非常重要的。

在Python中,字符串和整型对象都是不可变的(immutable)类型,因此Python会很高效地缓存它们。这样的处理机制能提升Python的性能。因此,我们看到下面示例中str1和str2也都是指向同一块内存地址:

str1='a'
str2='a'
id(str1)==id(str2)
True

当然,对于int(整形)数据也是如此

a=1
b=1
id(a)==id(b)
True

接下来请注意:

a=-7
b=-7
id(a)==id(b)
False

震惊!居然不一样!

str1='aasfasfas'
str2='abcfasfas'
id(str1)==id(str2)
False

字符串也是如此!

解释

Python能够帮我们缓存多少呢?Python2.3简单整数缓存范围是(-1,100),Python2.5.4以后简单整数缓存范围至少是(-5,256)。所有的短字符也都在缓存区,但是tuple()不可以

x = (1,2)
y = (1,2)
id(x) == id(y)
False

这是因为在Python中符号()不仅仅是元组,它被重载为分组操作符,由圆括号()包裹的单一元素首先被当做分组操作,而不是元组

BUG here ??

交互式命令行中运行

a=888
b=888
id(a)==id(b)
False
a is b
False

Pycharm中运行

a = 888
b = 888
print(a is b) >>True
print(id(a) == id(b)) >>True

两种不同的运行方式,第一种是直接采用解释器运行,第二种是把代码当做脚本运行,结果居然不一样

关于这个BUG,经过我多日通宵研究,是这样子的

  • 出于性能考虑,Python内部做了进一步优化,怎么优化呢?但凡是在同一个代码块中的代码,如果出现两个值相同的整数,那么它们将被重用

  • 上面代码是在一个test.py文件中,运行时,a和b的id值相同,因为a、b 在同一个代码块,属于模块级别,创建 b 的时候,发现同级代码块中有个b的值了,就重用了这个对象。

  • 在 Python 的交互式命令行中,每单独一行都视为一个代码块,同一行中的代码属于同一个代码块,因此不难理解,创建b时候无法引用a。

  • 换句话说,以文件脚本形式执行的时候,会先将源码翻译为字节码,也就是pyc或者pyo文件,Pythoin解释器会自动重复引用一些变量,以节省内存使用。在控制台执行的时候,代码是以交互形式逐行执行的,解释器不会进行优化,但对于一些常见的数字和字符串,还是会有优化。范围【-5~256】

python的数据缓存的更多相关文章

  1. 第三百节,python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型

    python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型 delete(*names)根据删除redis中的任意数据类型 #!/usr/bin/env pyt ...

  2. python -- 小数据池 is和 == 再谈编码

    1.小数据池 python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元. 代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块, ...

  3. python 小数据池,is and "==",decode ,encode

    一:小数据池 1.python运行中的缓存: 2.目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 3.python 缓存数据:缓存:int, str, bool.         ...

  4. 【转】Python用数据说明程序员需要掌握的技能

    [转]Python用数据说明程序员需要掌握的技能 https://blog.csdn.net/HuangZhang_123/article/details/80497951 当下是一个大数据的时代,各 ...

  5. Python小数据池,代码块

    今日内容一些小的干货 一. id is == 二. 代码块 三. 小数据池 四. 总结 python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. ...

  6. 第三百零一节,python操作redis缓存-管道、发布订阅

    python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...

  7. 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表

    python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...

  8. 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表

    python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...

  9. 第二百九十七节,python操作redis缓存-List类型,可以理解为列表

    python操作redis缓存-List类型,可以理解为列表,是可以有重复元素的列表 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name ...

随机推荐

  1. (二)廖师兄springboot微信点餐虚拟机说明文档

    虚拟机 VirtualBox-5.1.22  系统 CentOS7.3账号 root密码 123456 软件:jdk 1.8.0_111nginx 1.11.7mysql 5.7.17redis 3. ...

  2. 测试_QTP简介

    一:什么是QTP? QTP(QuickTest Professional)是一款自动化测试工具,自动化测试就是利用计算机模拟人进行测试,也就是开发一套代码测试另一套代码. QTP主要用它来执行重复的手 ...

  3. 基于udp的scoket通信

    1.udp例子1 udpserver.py # udp的server,不需要进行监听也不需要建立连接 # 在启动服务之后只能被动的等待客户端发送消息过来 # 客户端发送消息的同时还会自带地址信息 # ...

  4. 用JavaScript做精灵图

    用JavaScript做精灵图 精灵图可以不用在给每一个小块一 一的修改位置.主要原理是找到整张的背景图与li的下标的数学关系. 这是一大张背景图,这个背景图的位置其实是有规律的,每两张之间间隔一个固 ...

  5. 使用XSL解析XML输出HTML(XSL学习笔记一)

    最近项目用到 XSL + XML,XML大家应该很熟悉,XSL暂且不解释,先看效果,如果想学习XSL的内容,可以先访问: https://www.w3school.com.cn/xsl/xsl_lan ...

  6. CURLOPT_FOLLOWLOCATION

    curl爬取过程中,设置CURLOPT_FOLLOWLOCATION为true,则会跟踪爬取重定向页面,否则,不会跟踪重定向页面

  7. Navicat总是提示主键不存在问题

    Windows 和 Linux:打开navicat > 找到工具 > 点击选项- > 外观 > 点击数据 & 网格 > 取消勾选显示主键警告 > 确定. M ...

  8. Hbase启动报java异常

    在conf文件夹下的hbase-env.sh文件中的j添加ava_home的环境变量, ******************************************************** ...

  9. 使用iOS 设备管理器 iMazing导出苹果设备中的录音文件

    iMazing是一款功能强大的苹果设备管理软件,能为用户提供便捷的录音文件导出功能.用户可以直接将录音文件从苹果设备中导出,接下来,就让小编为大家演示一下如何操作吧. 图1:iMazing界面 1.打 ...

  10. CorelDRAW绘制的优秀人物肖像插画作品

    艺术创作 关于作者 Dmitry Demidenko (LINEKING),1986 年出生于俄罗斯的斯帕斯克达利尼.他自幼痴迷于绘画,而且对矢量图形很有天赋.他从一家小型省立印刷公司的小设计师做起, ...