转自:https://blog.csdn.net/pro_leo/article/details/41786397(有修订)

1、Python缓存作用:

  a、提高执行效率。

  b、减少内存负担。

2、首先,我们看下面这一段code:

>>> num1, num2 = 1, 1
>>> print num1 is num2
True
>>> id(num1), id(num2)
(3965416, 3965416)
>>> num3, num4 = 1.0, 1.0
>>> print num3 is num4
False
>>> id(num3), id(num4)
(22416168, 22416184)

可以看到:num1和num2的值都是1,它们的内存地址也都是一致的;而num3和num4的值也都是1.0,但是它们的内存地址却不同。

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

>>> str1, str2 = 'a', 'a'
>>> print str1 is str2
True
>>> id(str1), id(str2)
(22171104, 22171104)

那么,是不是所有的整型和字符串Python都会帮我们缓存呢?答案是No。正如我们学习英语的时候并不需要记忆所有的单词,而是只选取了一些高频词汇。Python也采取这样的策略。我们会在下面的示例中看到并不是所有的整型和字符串Python都会帮我们缓存:

>>> num5, num6 = 300, 300
>>> print num5 is num6
False
>>> id(num5), id(num6)
(24972028, 24971416)
>>> str3, str4 = 'abc', 'abc'
>>> print str3 is str4
False
>>> id(str3), id(str4)
(29674688, 29674656)</span>

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

5、既然简单整型和单字符都能缓存,同样作为不可变类型的元组(tuple)能不能也能缓存呢?我们继续看下一组测试:

>>> tuple1, tuple2 = (1, ), (1, )
>>> print tuple1 is tuple2
False
>>> id(tuple1), id(tuple2)
(24899856, 24756080)
>>> tuple3, tuple4 = (1, 2), (1, 2)
>>> print tuple3 is tuple4
False
>>> id(tuple3), id(tuple4)
(29705880, 24881752)</span>

  (PS:tuple1和tuple2在定义时声明为(1, ),这是因为在Python中符号()不仅仅是元组,它被重载为分组操作符,由圆括号()包裹的单一元素首先被当做分组操作,而不是元组)

6、我们没有看到元组表现出缓存机制。这是为什么?因为缓存机制是为了解决数据快速存取的问题,简单整型和单字符都是较常使用的变量,而元组并没有常用元组一说,因此没有缓存机制也在情理之中。

Python 缓冲区的更多相关文章

  1. Python——缓冲区

    原创声明:本文系博主原创文章,转载及引用请注明出处. 1. 在Python中,字符串和整型对象都是不可变的(immutable)类型,因此Python会很高效地缓存它们. 2. Python2.3简单 ...

  2. python 缓冲区 subprocess 黏包 黏包解决方案

    一.缓冲区 二.两种黏包现象 两种黏包现象: 1 连续的小包可能会被优化算法给组合到一起进行发送 黏包现象1客户端 import socket BUFSIZE = 1024 ip_prort = (' ...

  3. Numpy系列(一)- array

    初始Numpy 一.什么是Numpy? 简单来说,Numpy 是 Python 的一个科学计算包,包含了多维数组以及多维数组的操作. Numpy 的核心是 ndarray 对象,这个对象封装了同质数据 ...

  4. Lesson1——Tensor

    Tensor Method 描述 is_tensor(obj) 如果 obj 是 PyTorch 张量,则返回 True : is_storage(obj) 如果 obj 是 PyTorch 存储对象 ...

  5. Python网络编程——修改套接字发送和接收的缓冲区大小

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  6. python输出缓冲区的问题

    碰到的问题,一段代码,print在前,log的在后,查看日志中log的反而在前面.是python输出缓冲区的问题. python输出缓冲区要满 4k 才写入文件,除非禁用缓存或者强制输出或者程序结束. ...

  7. python 读取二进制数据到可变缓冲区中

    想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作.或者你想原地修改数据并将它写回到一个文件中去. 为了读取数据到一个可变数组中,使用文件对象的readinto() 方法.比如 im ...

  8. Python StringIO实现内存缓冲区中读写数据

    StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以像操作磁盘文件那样来操作StringIO.这篇文章主要介绍了Python StringIO模块,此模块 ...

  9. 后台运行python程序 遇到缓冲区问题

    From: http://www.iteye.com/topic/867446 环境:linux 一段执行时间很长的程序(用python做hive客户端执行mapreduce) 在linux后台执行, ...

随机推荐

  1. JavaScript 无刷新修改浏览器URL地址栏

    //发现地址栏已改为:newUrlvar stateObject = {}; var title = "Wow Title"; var newUrl = "/my/awe ...

  2. sock_ntop.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in ...

  3. 单选按钮QRadioButton

    继承  QAbstractButton import sys from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QApplicat ...

  4. OpenCV入门(2)- Java第一个程序

    1.下载和安装OpenVC环境 从官方连接 https://opencv.org/releases.html 下载Windows的安装包 下载下来的就是一个压缩包,安装解压后,对Java开发有效的目录 ...

  5. Springboot使用FastJson后,接口返回中文乱码的问题解决。

    哎,天下文章一大抄,到处都是一模一样的教你怎么替换掉jackson成fastjson的,可后续中文乱码网上居然没一篇文章.翻了一会源码还是写个文章共享下吧.免得后来人又浪费时间折腾. 在springb ...

  6. 前端 - js方式Ajax/ jquery方式Ajax / 伪 ajax /伪ajax 进阶方式

    DJANGO环境搭建: 目录文件: 关闭CSRF 添加目录文件路径 配置url 视图配置: index页面配置: 测试:(成功) 进入正题: ajax 通过GET提交数据至后台: <!DOCTY ...

  7. python - 自定制property/property的延时计算

    自定制prooerty: #模拟@property 实现将类的函数属性变成类属性: #定义描述符 class msf(): def __init__(self,obj): self.obj = obj ...

  8. python - class类 (七) 三大特性 - 封装 结尾

    封装: # 封装 #第一层,类就是麻袋,本身就是一种封装 #第二层,类中定义私有的,至在类的内部使用,外部无法访问 #第三层,封装在于明确区分内外,使得类实现者可以修改封装内的东西二不影响外部调用者 ...

  9. 终端命令行开启和关闭mac隐藏文件

    defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.apple.finde ...

  10. Dom4j用Xpath获取节点——(六)

    xml文档 <?xml version="1.0" encoding="utf-8"?> <书架> <书> <书名 n ...