数学建模社区-数学中国

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

作者: zhangtt123    时间: 2020-6-16 10:34
标题: Python 代码块、缓存机制
一、id,is,==, C$ L( \& Y6 j+ R) m9 t  i4 _
Python中一切皆对象。对象包含三个要素,id、type、value。9 J% F) A! Z7 p2 c5 S" V. `/ m
: M) Z# U" }- W6 w+ V1 H& c! B3 V
id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。3 |+ v2 q8 ]% w; y3 n

* M4 L, f. g' Ctype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。. y2 f- J! E& B. k4 [' v- G
) \: I- V7 J6 M; C% S0 c1 \: s
value 是对象指向的内存地址中存放的具体的值。
' |' C# J/ J/ f8 F  m, b' @8 A
+ }* o2 v' y- b! z+ d' g5 k# }  r因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“
5 b; g( _# Z. h% W7 K- y) b9 s  h  R0 S% h! f: Z, t
is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
9 z- @( K! Z! \+ q4 X* B4 _" u/ C; p$ m( N4 O! E/ h
: s7 d1 G% S6 u( X! B
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
, y( \# a* N* t, p
% ]; l2 b+ O6 e6 R' t( G二、代码块
6 F- w* L+ k9 ?' [1 |Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的
# r3 ^+ R* W: m/ H: T
) e& S" u. t" X5 |' b9 ]代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块! T2 g3 L( C2 X  l7 U& y; g
1 Q' m; b: ]. K/ O
而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
* [/ b5 l6 v* t; q( H
! A9 z- Y5 z* t7 ^0 |9 e6 }2 y
  J4 K& g8 A2 A1 O6 j而对于同一个文件中的两个函数,也属于两个分别的代码块:
+ M7 ^1 B' s3 k1 Z& H! ~- |1 C( V2 s
! E: m: J# i1 C- w2 \
- V* }5 x! I& }代码块的缓存机制* z, m/ s, u8 `% O
前提条件: 同一代码块8 H% p( ]2 g% b% h9 j- y
$ j1 ^4 V$ M. p5 B
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。- q9 `9 H% S7 K# Q" V% ?6 o# |
' z4 {# ?9 X1 E' _6 C8 q
7 w* a. v5 }1 `- m* F( J7 L* O
2 |0 }7 I) i! U
; @, E; m' V' ^
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
( D* e( k$ a. I! V  ~# y: A2 i" |/ X# L
适用对象: int(float),str,bool
" k% P3 {- ~  \' f2 X0 V: k$ o, @2 R% A$ z! r/ h* E/ a$ c1 ?
对象的具体细则:
! b/ Q. k4 {8 V/ |) l5 M% L1 e; I+ _( k. P: Z: f5 P  L
int(float):任何数字在同一代码块下都会复用1 Q; A3 d  c8 i1 A) K# u/ `; Q2 ]7 }7 ^
bool:True和False在字典中会以1,0方式存在,并且复用) h+ ]" ^5 J" p/ B5 t+ s. W. p
str:几乎所有的字符串都会符合缓存机制4 I; b5 z4 K' Y& r# f9 J0 O7 z
非乘法得到的字符串都满足代码块的缓存机制
1 s# t3 W. g( `- W乘法得到的字符串
0 |7 {. Y) K! P0 [/ W) J) Q8 d乘数为1时,任何字符串满足代码块的缓存机制
# L7 A( @- T  k! W+ }乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制- @2 i3 x: B* y( F
优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存4 Q. A# q4 J: F" R. z8 H
' J# s2 {3 U5 X- G0 `9 v
3 d# u3 w, s1 b' _
2 f2 m* X, g( C2 a
三、小数据池& f* ?+ [, |2 e5 H% Y3 Y
前提条件: 不同代码块内。- R3 @1 g7 q; t  V
" h8 ~/ [4 k0 m) P$ s
适用的对象: int bool str
8 R2 Y& W% m- X( \5 U/ A* K
$ m- w5 }0 _: F6 y6 R, Q具体细则:
, V+ r5 G+ k7 G" J  l* D, L* `  }6 |& l# O, Q1 ~& L
int(float):-5~256- O6 b* e  i1 C! n/ e" p. o
bool:True和False在字典中会以1,0方式存在,并且复用- }' V4 `' L8 @3 W( a
str:满足规则的字符串
  B1 @7 S* q& @2 _字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
5 D8 Y0 d& W# |+ p  S3 I2 G9 l0 h+ t4 ^+ G: E2 T# q
字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留5 x, o3 v: G+ @! W! A/ F! T

' L2 H* E" @# B& y3 `! G7 @用乘法得到的字符串
, c7 U) X; ]! g% @/ g乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留* F% }: B  a0 m7 ?3 N! j* V
/ S. N/ V( G3 Z, t/ M1 D, G
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
* j' |: |: O% c7 I2 Z% V( b# s/ _9 U4 E# e. u
1 G% ]2 U) p0 o1 m' P, B
6 b6 o3 T' G# r5 h
四、总结1 p; Q: Q* H7 [8 t. Z3 S
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==0 u6 F" w+ f# I# X% C
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
/ u8 G5 N/ q) o+ i) M————————————————
, {# W5 i* \7 V/ ?版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 o) s( x! @' P0 H) C8 |原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
; V) R( ]9 \& r. Y3 B
! o7 {0 g/ w" a$ r: M6 x6 n9 n/ Q8 h. Y4 B





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