数学建模社区-数学中国
标题:
Python 代码块、缓存机制
[打印本页]
作者:
zhangtt123
时间:
2020-6-16 10:34
标题:
Python 代码块、缓存机制
一、id,is,==
7 j9 S' N- C v+ ~9 m3 v" U, \
Python中一切皆对象。对象包含三个要素,id、type、value。
8 B; h- Y) Y5 s
2 z- |' V) t9 f& e
id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。
2 L# x" g5 O; ]2 I
5 r0 a4 S6 h% B( h- K
type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
/ Z) w" O1 v/ k+ D, M! x @4 f
2 @* u' w s7 k2 D' I
value 是对象指向的内存地址中存放的具体的值。
2 H' n9 H) c- i/ p
' x+ R* G: p8 @- ~6 y- _% z+ K6 Z1 u
因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“
: g. r1 l) {6 t, _! o/ j3 G) n
# I, c! F* S O& u/ x
is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
, O5 v; |- s0 e' B' S
' T* d& g# ?8 c0 w* |3 r
$ w, z* D6 T5 P
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
2 n9 c1 w+ Y8 I+ N4 ^! V
/ B# d$ `8 c8 w: F' z3 c
二、代码块
3 n( q7 V1 I' |6 z
Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的
( P6 U* X3 ^1 E- q, w/ Y% s" }
: l: o( R; F1 c5 f7 S8 k
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
) l% b8 s7 w; X5 k, s* {: Y
- G* U1 a: Z1 V+ B8 T. u
而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
/ X& ^6 s& M6 o1 r8 m/ E, J. U& r
/ S/ K: c) g, U+ [0 T5 L
' v5 }; P7 I- R# N% j
而对于同一个文件中的两个函数,也属于两个分别的代码块:
8 V) w" n! y a! [) }' P
/ T9 U s [- t- Q8 F. d; Z1 L7 W
+ J5 y1 j( ?( ~0 h
代码块的缓存机制
% j4 x$ q' c- P6 Y" B
前提条件: 同一代码块
1 s4 |& p; t7 Q0 N$ E; J( K
/ J# z- {" S2 ~: t+ O4 o: j7 a
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
) w: x: ]+ t- E6 k2 r2 G5 _8 Z
; J1 j0 U1 ~" b6 N- E. t9 |
7 M, Q6 r1 {. x/ f
/ W# k! \$ n! n6 N
+ ^/ x; m! ^9 c6 F( B3 Q8 X
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
; I8 c- K- D, t% k: f. z
\/ A+ P/ Z/ E" b! |
适用对象: int(float),str,bool
3 t# g5 N( y& M6 Z; \
' O/ f, G& n$ @+ P* Z$ J5 ~) o
对象的具体细则:
0 F( j7 _7 z! ^7 O; e' ^
) f: R5 S, E* H' F9 r* E
int(float):任何数字在同一代码块下都会复用
* D7 p0 z8 B ^
bool:True和False在字典中会以1,0方式存在,并且复用
& s) V8 F6 m$ K
str:几乎所有的字符串都会符合缓存机制
) O r+ O/ [2 X9 d
非乘法得到的字符串都满足代码块的缓存机制
6 f n3 G4 [6 o* s d$ [- Q }9 X
乘法得到的字符串
5 _- n b% k8 L1 T: E
乘数为1时,任何字符串满足代码块的缓存机制
% Y- i) T1 [0 S& k" d1 {+ c
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
( P3 {/ n% r3 }# p( ~
优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
' w$ ^, f% _/ o" f% n9 l
1 I. U2 b% h$ ?& }# u# V0 R
* j1 v) D+ o% v! ?. @! S% L
0 G6 O; B: H+ ~5 {, U0 ~0 y$ K
三、小数据池
% S7 ?" g$ ^# Z+ d' x! M
前提条件: 不同代码块内。
* g5 }, `% @1 d+ ^9 O' d
& o! o+ u( P$ W$ f( k
适用的对象: int bool str
8 E0 `( T9 w0 k8 P$ \& o' g4 K" ~
) n7 V& B- ?" F& _4 t4 u9 l
具体细则:
. N# c+ }7 H) D" L8 }. G
4 O6 L% L0 i1 `" y! v q9 u1 f; b
int(float):-5~256
# U8 |0 B7 n/ h& Y% K* S* p2 K) s
bool:True和False在字典中会以1,0方式存在,并且复用
) \4 E5 ~2 H- E& E) Y
str:满足规则的字符串
, A( X8 H5 n6 O; P
字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
$ U4 D# U e/ K2 ]1 A
8 J% i5 v' w3 p6 t/ ?( v
字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留
( ]* ?+ \: {$ | t
) \) l2 i' y' d6 @1 S% u P1 o
用乘法得到的字符串
& H0 L$ C- W6 I3 k
乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
) w, c) I4 j" e: G* d$ N6 G
2 z; u2 a$ F F$ w
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
2 J: W$ V0 |: a
+ E4 L' b# ?3 R0 q6 } z; y
1 J) n3 E: f' J
1 e* c# O* f* ~* P* {% [
四、总结
) N3 Q+ u4 g$ h Z& u: j
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==
: l ]6 P R$ ]5 x" N2 h) _
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
; f' F. Y8 k( {; d
————————————————
; {! F) R) z0 b! x
版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 y6 @5 u; X) s$ P/ f3 B1 `/ M/ t5 W
原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
) w; }4 \, c' l7 S7 j
; a* h5 u, B5 F0 x- }- K' A @
4 c4 V3 b$ i: x t# m& U7 \; \
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5