数学建模社区-数学中国
标题:
Python 代码块、缓存机制
[打印本页]
作者:
zhangtt123
时间:
2020-6-16 10:34
标题:
Python 代码块、缓存机制
一、id,is,==
% [( |! y; G; ]6 a
Python中一切皆对象。对象包含三个要素,id、type、value。
7 z; R0 B0 L3 F- x+ v
d: w+ W8 J: H9 K+ ^# ~$ ]
id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。
* T& d) e; e! e. B& }, }
4 E; F9 e! s* g: N0 v9 c; P0 `) p
type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
7 j9 r) P( T) i) J1 O4 N2 j
; W1 P6 R. G2 O7 a; u: w2 `
value 是对象指向的内存地址中存放的具体的值。
4 m8 `5 a' U1 {+ W3 }4 s2 l+ q9 Z/ R0 M
( f( q3 e& p# n5 ^8 t
因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“
3 N ]( y9 Q3 ~* i1 \) X- s7 B
+ ~; N, F$ _0 h" q( S6 P
is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
3 E; O+ k) M1 H3 W4 W1 L
- ~1 m" J" G9 N# t6 j! V [2 H
+ ^3 V& }, Q6 o7 L z
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
3 U. s1 W& H1 a1 ]& o
' A9 ^- d9 A* ~
二、代码块
' \. d7 b6 O+ `" F
Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的
2 P' q$ r6 T9 \. r3 K3 c3 W5 @2 A( b
" _ \2 P; A( O( ~0 J
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
) b; b+ B/ a2 T6 U
; H9 d4 Q7 w- |8 m1 F8 e
而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
! ]8 @3 S8 j8 V& f% k' f) t2 G* W
7 j5 T9 Q5 C' _) T+ S) ?
8 c4 p) i, C* w/ n" D8 [* t
而对于同一个文件中的两个函数,也属于两个分别的代码块:
6 }1 m v( {/ d1 C/ H# W& b
8 V: p( r& B$ k5 ^. \% _* m
- d) K; }" Z# @/ E$ h) P
代码块的缓存机制
3 h; | }, B6 _ F) j, O3 U+ J/ z
前提条件: 同一代码块
& {/ H) @% F/ W7 n
# D* @ i0 C0 B6 O6 A
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
/ C9 |( j. ^4 \8 s$ P) X
$ U7 N0 X( M S: N T, D, O
4 P; U2 ~! e- p( C( O
4 H8 c% L; o* c$ `4 K
9 i4 `* {7 _, ~/ \$ w
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
0 m% e8 F+ b6 ?8 [
" {& y* |* p2 g9 f1 t1 k
适用对象: int(float),str,bool
( U. }$ B/ I0 l+ Q
/ h, g; a: ^; \
对象的具体细则:
1 u, W% o$ F% |" a
" k [! m* M6 ?7 [; b
int(float):任何数字在同一代码块下都会复用
/ f4 b8 j5 {9 L5 K) l
bool:True和False在字典中会以1,0方式存在,并且复用
9 Z8 n5 i6 X# J9 h0 t1 @( K: y
str:几乎所有的字符串都会符合缓存机制
) Z9 a* D, |4 y& Q. H S" j& g
非乘法得到的字符串都满足代码块的缓存机制
! I& H2 |+ T* c8 X# ~
乘法得到的字符串
* c7 I7 q# Z9 }/ F
乘数为1时,任何字符串满足代码块的缓存机制
* _% f' ~7 a, d% r' U/ V
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
& F% Y. v7 S4 ^1 p
优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
+ ~3 M/ S. G& r0 s/ b
) H' ~$ |+ ^- K5 ~! x
]6 A7 k( Q( T p5 m6 r! k
' {9 M' }/ w' X% o
三、小数据池
+ a5 [; G1 p+ S7 d5 P" Q% W
前提条件: 不同代码块内。
9 t8 C: F$ C4 s4 n
- K, p+ M- Q1 t# e3 n$ Q, `# h7 e5 |- Q
适用的对象: int bool str
# H* ?& b7 O+ H: j P
* ^- l) R$ h& C6 r: A9 \
具体细则:
9 T3 _0 a! N& \8 w; d5 e
- @) B" N3 ~. R% l1 `+ j" h
int(float):-5~256
7 d' `6 n, h& M$ x
bool:True和False在字典中会以1,0方式存在,并且复用
1 n* ~# d' @6 r/ |# I
str:满足规则的字符串
) R. y% k: w# x- c- |9 b! i
字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
! r$ K+ q6 d) V& H
" ~5 X$ ~) H$ `* X- r
字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留
: |5 j6 M* \" ]6 _/ K. E8 }
, t/ G8 M* m) s8 h! M
用乘法得到的字符串
8 E9 p; _: t. u' M, w% f9 M
乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
( b+ M) U6 B% P8 z5 X$ Z* D
! S/ o: R& F* S4 Q w
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
8 R4 B9 I9 c0 _$ x7 Y$ N7 |% ~6 A
6 r( o+ w: n$ M7 Z" b# V
6 `* {9 q$ Z5 z
3 S0 I7 H- a" g2 F4 V
四、总结
6 v5 N4 U( u* j/ ^
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==
+ Y( ]& z$ e$ f- `3 W
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
- Q( B$ R- `; [/ i1 q
————————————————
# i& d- n2 h8 E/ c; }% w
版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: H+ i$ V( ~8 `+ K; J
原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
2 o+ I) s; G( r. \. j
& e! _# r/ x6 h8 w6 {
/ w4 T0 [5 \3 p# z1 P- H
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5