数学建模社区-数学中国

标题: Python 代码块、缓存机制 [打印本页]

作者: zhangtt123    时间: 2020-6-16 10:34
标题: Python 代码块、缓存机制
一、id,is,==9 Z- K1 E+ \2 ]: Y
Python中一切皆对象。对象包含三个要素,id、type、value。
  _3 H* G( n. }1 t& p0 `- k3 _
9 B( I0 U( l& r! `" X! rid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。
& k# F4 z6 o) @* a! h/ A9 \4 a* D
! u4 L7 O5 [2 O7 E( U8 X# }" ~) r% L! btype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
6 {* I6 [/ U  I7 {7 M3 e& T& h( l% u: [+ S, J
value 是对象指向的内存地址中存放的具体的值。0 J5 t" h. b2 @, d" N
0 t7 l2 ^% C  f6 U% r7 c
因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“- V2 N9 k2 M7 t. P- ]* B9 i/ h

: I, e+ Q6 o* J: n0 H7 @is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
; Z- z" X6 q  ?! N0 @0 o) s8 }$ P3 k/ y1 P' o0 r& ~

, y7 I, E# ?# y+ R7 F我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
5 b: n; o" Y( a. ~. N
! F" c% w! y' n二、代码块4 C9 S* r$ B' V
Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的
8 U  f9 _; p" `" s' l! v3 E
2 l6 W5 d7 Z) W. G' l2 R代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
6 p7 F6 B( P7 o4 C. A7 ?0 |$ t
而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
) o! E9 Y. n! e3 u9 e% S. a" E& ?; |7 n! j6 i) G% t
4 @4 z) J4 x! u. M* F0 S/ u* O
而对于同一个文件中的两个函数,也属于两个分别的代码块:) k6 C" {0 W; |0 T- Y4 R7 \
) O5 I2 X: D+ B  R
1 P/ K9 R# y% v: k
代码块的缓存机制5 a$ I& `! Q" a$ ?
前提条件: 同一代码块3 R1 G/ X% J3 k$ a, H

$ s; F" }! G2 O机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。9 C$ g  B+ E+ \+ ?  `

$ B, E# Z$ W" l& L- ]# x" t0 {3 `# N9 g- }6 Y3 K8 F
* i3 o0 a* M1 [
3 Y9 p8 F" y. W" K( K/ @& S8 C7 `
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
$ d6 `5 B, t# F
4 C+ b4 \, i  z# o适用对象: int(float),str,bool& r" e: A  q$ Z3 o8 ^
* e7 d: I7 }# ?# V
对象的具体细则:
# d* B6 l6 `7 L& c9 {; P/ \2 x% [& F9 t) c
int(float):任何数字在同一代码块下都会复用) n4 k. {- y" y$ \0 v# }" I- K. s
bool:True和False在字典中会以1,0方式存在,并且复用
  p+ Z+ r( B: y; Rstr:几乎所有的字符串都会符合缓存机制# B' c0 R2 s$ K; Y3 t, N/ G
非乘法得到的字符串都满足代码块的缓存机制$ G1 z# L5 H% x, r; E) }6 L
乘法得到的字符串
; D1 V: h7 u: f乘数为1时,任何字符串满足代码块的缓存机制
1 r( F9 d. D. q  y4 C乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
. c6 @  f& I" h0 t3 Y* n9 s, U( ^8 U优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存/ e; J' h+ |9 n5 L3 [
. t3 y1 p( E9 p2 i0 V  U
( R! N7 }2 W( p9 Y7 |9 N
6 A; U  _# q6 o, D( ^) a  r$ o8 o
三、小数据池
5 o9 j* v* e. E% S' t5 t; a% z+ b& Q9 A前提条件: 不同代码块内。9 G3 ]7 F) T# S1 N: O

. }$ G4 k+ D6 H2 x6 S5 I适用的对象: int bool str
, U: L2 Z3 c+ t3 ^4 Q+ a# J' n7 z- L2 a+ j6 D
具体细则:
4 v+ V6 O! f4 D& [1 [# G4 y7 V4 Z+ G! U% k7 e' o
int(float):-5~256
1 H' g: e# L% ^$ p8 E5 gbool:True和False在字典中会以1,0方式存在,并且复用
) M8 t& @' v& ?$ @6 Dstr:满足规则的字符串
7 N0 Z; l7 G5 T2 ?; F" p, S: m7 D* H字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
% m# k" B7 U  J4 [, w; L, {. q& E) i4 c
字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留, K" p* {* Z3 C' L

, i4 V4 o2 F+ w$ K' z用乘法得到的字符串
6 A8 w4 }# W  F' y$ S/ o乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留, s2 U3 m0 F* F2 q) V) r

1 [0 j# E# Z3 w5 Q% I2 p乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制, D  D. @- u6 _$ \1 h6 l

7 P3 {' X5 M; `: W+ e0 b" E+ H4 L5 w8 c" C( i
$ i! a0 d  D! W) }5 E. |
四、总结: C  x' `8 G% G9 c
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==1 e8 i& v5 U$ [
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)0 ?2 Q7 l, L5 r/ f* @; n  h
————————————————
7 H% I- O: U: x! M+ Z! `$ L版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  [7 u( B3 b1 N. K$ h: G* {
原文链接:https://blog.csdn.net/weixin_42511320/article/details/1056508425 O. K4 ?- b( @  V* Z8 K7 w  ~+ j9 W& @

; z+ ~0 A# I" N- f# b. Z* u  o" x





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5