第四章

4.1 小数据池

4.1.1 代码块

一个模块,一个函数,一个类,甚至一个command命名都可以称之为一个代码块。

官方解释:

A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter)

is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block. A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.

4.1.2 is与==的区别

​ == 判断左右两端的是否相等

​ is 判断的是两端内容的内存地址是否相同,如果返回的True,那么判定比较的两个变量使用的是同一个对象。

​ id的作用:用来查看开辟的空间所对应的地址

lst1 = [1,2,3]
lst2 = [1,2,3]
print(lst1 == lst2) #True
print(lst1 is lst2) #False a = 'hahah'
b = 'hahah'
print(a == b) #True
print(a is b) #True

​ 注意:在python中,默认会把数字,字符串,布尔值进行缓存。

如果我们在从command控制台里写代码与在py文件中写代码机制是不一样的,因为环境不同所以缓存是不一样的,因为command控制台一行就是一个代码块。

总结:如果内存地址相同,那么值一定相同;如果值相等,内存地址不一定相等。

4.1.3 小数据池

原文:

在整数中:

​ The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined.

在字符串中:

​ Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. –引自维基百科

​ ⼩数据池,一种数据缓存机制,也被称为驻留机制。为提高效率,固定数据类型使用同一个内存地址;各⼤编程语⾔中都有类似的东⻄,在一定范围内来说,常量池,小数据池指的都是同⼀个内容。

​ ⼩数据池只针对: 整数,字符串,布尔值。其他的数据类型不存在驻留机制。

在控制台中:

​ 1.数字:在-5~256之间的数值可以被缓存;

​ 2.布尔值:

​ 3.字符串:

​ 字符串的长度为0或1时,会默认进行缓存;

​ 字符串自己定义,长度不限,但字符串只包含字母,数字,下划线的时会缓存;

​ 用乘法得到的字符串:·乘数为1,仅包含字母,数字,下划线时会缓存,如果包含其他字符, ⽽⻓度<=1 也会被驻存; ·乘数⼤于1,仅包含数字, 字母, 下划线这个时候会被缓存,但字符串长度不能大于20;

​ 特殊字符(中文除外), 定义为 1 个字符时,会进行驻留;

在代码块内部(一个py文件):

​ 1.数字:基本上都可以进行缓存,但是临界值没有明确的限定;运算结果-5~256之间会缓存

​ 2.布尔值:可以进行缓存

​ 3.字符串:默认字符串都缓存,如果有乘法运算与控制台相同;python3.7版本乘法不能超过4096

总结:执行同⼀个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中, 在遇到新的变量时, 会先在字典中查询记录, 如果有同样的记录那么它会重复使⽤这个字典中的之前的这个值。

如果是不同的代码块, 他就会看这个两个变量是否是满足小数据池的数据, 如果是满⾜小数据池的数据则会指向同⼀个地址。 所以: a, b的赋值语句分别被当作两个代码块执⾏,但是他们不满足⼩数据池的数据所以会得到两个不同的对象,因⽽is判断返回False。

优点: 能够提⾼一些字符串,整数的处理理速度,省略的创建对象的过程;

缺点: 在'池'中创建或者插入新的内容会花费更多的时间。

强行驻留

from sys import intern ##自己进行驻留

指定驻留:通过sys模块中的intern()函数来指定驻留内容

from sys import intern
a = intern('hahah'*5)
b = intern('hahah'*5)
print(a == b) #True
print(a is b) #True

4.1.4 编码的补充

  1. python2中默认使⽤的是ASCII码,所以不支持中⽂;如果需要在Python2中更改编码,需要在⽂件的开始编写:
-*- encoding:utf-8 -*-
  1. python3中: 内存中使⽤的是unicode码,因为Unicode是定长的;代码使用utf-8来存储

编码回顾:

  1. ASCII : 最早的编码,⾥面有英⽂大写字母, ⼩写字母, 数字, 一些特殊字符,没有中⽂,8个01代码, 8个bit, 1个byte;
  2. GBK: 中⽂国标码, 里⾯包含了ASCII编码和中文常⽤编码,16个bit, 2个byte
  3. UNICODE: 万国码, ⾥面包含了全世界所有国家文字的编码, 32个bit, 4个byte, 包含了ASCII
  4. UTF-8: 可变⻓度的万国码,是unicode的⼀种实现,最⼩字符占8位

    1.英⽂: 8bit --1byte

    2.欧洲文字:16bit --2byte

    3.中文:24bit --3byte

    综上, 除了ASCII码以外, 其他信息不能直接转换

编码encode

.encode('UTF-8')--结果是Bytes类型,但依然是原来的字符串,其表现形式:

  1. 英文 b'alex' 英⽂的表现形式和字符串相同
  2. 中⽂ b'\xe4\xb8\xad' 这是⼀个汉字的UTF-8的bytes表现形式

​ 英文编码之后的结果和源字符串⼀致;中⽂编码之后的结果根据编码的不同,编码结果也不同。 由此可见, ⼀个中⽂的UTF-8编码是3个字节,一个GBK的中⽂编码是2个字节,编码之后的类型就是bytes类型。在⽹络传输和存储的时候我们python是保存和存储的bytes类型。那么在对方接收的时候,也是接收的bytes类型的数据。

s = b'abc'  #如果元素是子母等,不需要encode
s1 = '哈哈'
print(s)
print(s1.encode('gbk'))

解码decode

用什么编码,就用什么解码

.decode('utf-8')

编码和解码的时候都需要制定编码集格式。

utf-8与gbk不能直接相互转换。

python学习之内存驻留机制简述的更多相关文章

  1. C#入门篇6-8:字符串操作 深入研究字符串的内存驻留机制

    //字符串的内存驻留机制 public static void Test() { //当有多个字符串变量包含了同样的字符串实际值时, //CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字 ...

  2. python学习Day9 内存管理

    复习 :文件处理 1. 操作文件的三步骤:-- 打开文件:此时该文件在硬盘的空间被操作系统持有 |  文件对象被应用程序持用 -- 操作文件:读写操作 -- 释放文件:释放操作系统对文件在硬盘间的持有 ...

  3. JVM内存回收机制简述

    JVM内存回收机制涉及的知识点太多了,了解越多越迷糊,汗一个,这里仅简单做个笔记,主要参考<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 目前java的jdk默认虚拟机为H ...

  4. python学习之内存机制

    不可变对象(字符串.元组) 1. a = 1 首先在内存中创建对象1,并记录对象的引用计数为1次. id(a) 查看变量a引用的对象的内存地址 2. b = 1 内存中已存在对象1,变量b引用对象1, ...

  5. Python中的内存管理机制

    Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自 ...

  6. PythonStudy——Python 内存池机制 (Memory pool mechanism) Pymalloc

    Python是如何进行内存管理-内存池机制 Pymalloc Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于对小块内存的申请和释 ...

  7. 【python测试开发栈】—python内存管理机制(二)—垃圾回收

    在上一篇文章中(python 内存管理机制-引用计数)中,我们介绍了python内存管理机制中的引用计数,python正是通过它来有效的管理内存.今天来介绍python的垃圾回收,其主要策略是引用计数 ...

  8. Python_驻留机制

    #coding=utf-8 #coding:utf-8 #- * -coding:utf-8 - * - '''以上为注明字符串的编码格式''' #驻留机制 '''Python支持短字符串驻留机制,对 ...

  9. JVM内存回收机制

    1. JVM内存回收机制简述 http://www.cnblogs.com/lzrabbit/p/3826738.html

随机推荐

  1. [易学易懂系列|rustlang语言|零基础|快速入门|(20)|错误处理]

    [易学易懂系列|rustlang语言|零基础|快速入门|(20)|错误处理] 实用知识 错误处理 我们今天来讲讲Rust中的错误处理. 很多语言都有自己的错误处理方式,比如,java是异常处理机制. ...

  2. Linux下Mongodb的安装

    [root@localhost usr]# cd /usr //创建Mongodb目录 用于存放Mongodb的程序 [root@localhost usr]# mkdir mongodb [root ...

  3. 我说CMMI之七:需求管理过程域--转载

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dylanren/article/deta ...

  4. 关于css阴影和浮动

    盒子阴影box-shadow box-shadow:0 0 1px #000 inset; 水平  垂直   模糊  颜色 : [1] inset代表框内阴影,不加inset代表框外阴影 [2]第1个 ...

  5. JavaScript分支结构Ⅰ—IF-ELSE

    ㈠程序 ⑴程序的流程控制 程序=数据+算法 ⑵程序的三种结构: ①顺序结构 ②分支结构 ③循环结构 ㈡IF结构 ⑴什么是分支结构? 程序在运行过程中,根据不同的条件,选择执行某些语句 ⑵什么是IF结构 ...

  6. jquery isDefaultPrevented()方法 语法

    jquery isDefaultPrevented()方法 语法 作用:isDefaultPrevented() 方法返回指定的 event 对象上是否调用了 preventDefault() 方法. ...

  7. 探讨MySQL的各类锁

    参考文档:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除了传统的计算机 ...

  8. Selenium 环境安装

    前言: 本人在学习Selenium时,用的版本是Python3.6+Selenium3,后续写的所有学习资料都是基于这套环境.在安装Selenium3前,请确保本机已安装好了Python3,如未安装可 ...

  9. Java 工程师成神之路

    基础篇 → 什么是面向对象 面向对象.面向过程 是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象.类.继承.封装.多态等基本概念来进行程序设计.从现实世界 ...

  10. HDU 3669 [Cross the Wall] DP斜率优化

    问题分析 首先,如果一个人的\(w\)和\(h\)均小于另一个人,那么这个人显然可以被省略.如果我们将剩下的人按\(w[i]\)递增排序,那么\(h[i]\)就是递减. 之后我们考虑DP. 我们设\( ...