QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4047|回复: 0
打印 上一主题 下一主题

[国赛经验] Python 代码块、缓存机制

[复制链接]
字体大小: 正常 放大

326

主题

32

听众

1万

积分

  • TA的每日心情
    慵懒
    2020-7-12 09:52
  • 签到天数: 116 天

    [LV.6]常住居民II

    管理员

    群组2018教师培训(呼和浩

    群组2017-05-04 量化投资实

    群组2017“草原杯”夏令营

    群组2018美赛冲刺培训

    群组2017 田老师国赛冲刺课

    跳转到指定楼层
    1#
    发表于 2020-6-16 10:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    一、id,is,==
    : Q( C! M5 X5 z$ f' `$ Q* JPython中一切皆对象。对象包含三个要素,id、type、value。8 b4 X) b( Q: R" e

    6 {4 y) z. Y4 `/ G7 c- @$ Bid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。; @: \% O& l  L# b4 Z, d2 d

    1 b  M9 r- A& N$ }0 D4 n+ Wtype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。+ E: I' p# o) i+ U, i6 s

    " [" f, }: A$ K- u/ ivalue 是对象指向的内存地址中存放的具体的值。
    - V: G! N1 E% E# P" s) l! D( h8 I% Q6 \: r* g
    因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“
    : E; e! M" x5 E6 U; a# }; j8 X% P$ |: ~& \+ C( X
    is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
    * `) d: c9 E% L8 T' T* r6 M% h
    , R2 d# K, g3 \# `) P: Q6 s- _$ h$ i7 j: T  }  S
    我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
    9 @1 r! \; K) D$ U+ j! m
    & d7 W# ~: @% B7 v* y2 a二、代码块
    4 P) G( k+ r6 z* ~. c! kPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的/ K3 h  R8 E% o! z# M
    / {: p- H/ ^" z. U& b% a2 P
    代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
    & A" t) B' R. y  X7 j, F' v" y* E
    # Z+ X7 f6 k/ y$ k  g5 Z! ^2 T. G而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
    - e' W/ f+ n2 h+ I! e* G% ]  n( k) Q) v+ K. G) m$ `

    * {& E* N2 Z" s( K0 L8 p, i' X而对于同一个文件中的两个函数,也属于两个分别的代码块:, w" n3 b, Z. E8 i  O: I* O

    ) J1 K3 A; n# V0 o% k# i0 @0 I/ ]+ |$ g# F0 E
    代码块的缓存机制( f. f# p$ X" Z4 H
    前提条件: 同一代码块
    8 r# r, k! k1 q# s: ~: f$ a' I+ }$ Z9 N
    机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
    - y7 Z5 K# ]! y# O( G7 T9 h; O7 k7 R4 H2 [
    & M% J, o# n4 F+ Y" G- v1 M

    5 }& T- {' b9 p' s/ t; H5 J& [' ?. C5 d0 ]" c0 n* ^; L5 D9 w7 t
    上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
      s/ U4 v/ M/ C* O# _/ y* i; ^3 l5 _& f. [9 O2 R: d
    适用对象: int(float),str,bool
    ) g" G% Q3 x+ \- }4 \* E+ k! c0 D9 j2 h# U6 M! z) c
    对象的具体细则:
    % B; P1 K5 V8 q' Q# i+ `" k+ o
    ( z2 F2 F/ G0 V- S: D% fint(float):任何数字在同一代码块下都会复用
    : u) H# s# A9 a" a. r' jbool:True和False在字典中会以1,0方式存在,并且复用/ ^4 F; o7 Q! o! }
    str:几乎所有的字符串都会符合缓存机制. G6 o: L9 v, W4 D. {+ U8 }/ {4 n
    非乘法得到的字符串都满足代码块的缓存机制- c, r1 {( p. H% C& f
    乘法得到的字符串- B( B5 v) e5 X
    乘数为1时,任何字符串满足代码块的缓存机制7 H7 t# \) [5 `$ b
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    % _9 I9 |) V1 \# b' x优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
    - u" ^. t; N) X, e7 s1 o
    , P$ v+ u  V% n  q  a* _3 Q7 e
    : A1 X8 M2 f0 w) k* a$ a9 V
    5 c; ^- Q: Y# w  i! M  o9 w$ L三、小数据池
    ( s7 j( `. O2 p; g- F# s前提条件: 不同代码块内。
      W3 K5 t  S* N% k9 k9 ^
    0 V" M5 W' E) n3 n6 n5 _适用的对象: int bool str
    : v  a  \$ p2 B; p# P; z; [: J0 ~- a) v
    具体细则:
    : U6 J. i* Q; _5 H2 b( r
    # G" f" P4 q4 `" [4 v2 y' tint(float):-5~256
    5 p+ d0 s3 ]' J, ~9 T( Bbool:True和False在字典中会以1,0方式存在,并且复用  g8 l8 q! S6 v" S3 ?
    str:满足规则的字符串
    * g5 g  [6 \+ l" e7 a, @字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
    9 K% k2 }. M) ]3 i( {% I
    ! k3 G) m% e( s" n# t( [2 p字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留
    3 H2 ?9 w+ I6 u( O2 e& q4 k0 k5 G' Y: K: l" ]
    用乘法得到的字符串
    9 m( F& W* ~7 s乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留. x: g$ o8 w  C
    & t, X, ?% q: `! B
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    * Z. V- c9 r# L+ K. O9 ?
    8 @+ V- ?# B2 p( n0 }/ A7 f1 ~
    * d* T8 H% k& E- X4 L' o8 W5 }1 d& j# y- G' K  r
    四、总结* q$ u! V( @4 [$ ~! ~# _; D6 }
    判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==
    , H$ E$ h, ]) j& }- n/ ~同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
    : l+ u. _# Q! t; r0 S4 N" [2 B) ?————————————————
    9 }9 ]' _) M8 |版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 T# o/ s) Z% \4 h7 f9 Z' y
    原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842! }% |" W+ R$ y5 r2 N

    3 m5 C( e( R$ x0 r6 y
    : S4 ^) T( r# e4 |8 C
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-5-8 02:32 , Processed in 0.342450 second(s), 51 queries .

    回顶部