数学建模社区-数学中国

标题: 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 s2 z- |' V) t9 f& e
id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。2 L# x" g5 O; ]2 I

5 r0 a4 S6 h% B( h- Ktype 是对象的数据类型。包括 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$ Kstr:几乎所有的字符串都会符合缓存机制
) 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 l1 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; bint(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; y1 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