QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4184|回复: 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,==- X6 ~4 J7 ?% q1 R4 Y+ o$ F
    Python中一切皆对象。对象包含三个要素,id、type、value。
    . B5 t+ P: p9 e3 _1 D( F: o6 y. t& X! m2 W9 k  W
    id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。4 t& I: ]  D9 }

    3 @; p) c& P3 [5 O' j! ctype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。- o' L9 e( b3 K; c& m

    . l1 P5 o. ?3 o& ~value 是对象指向的内存地址中存放的具体的值。
    8 J2 e2 a* y: d3 D6 X2 @4 ~/ Z1 ?$ ~2 M# T
    因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“. i) a- Q# @0 ~# P1 o/ y0 k8 e7 W4 K
    , F( g3 l5 U: F8 }9 I$ J- t
    is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
    0 {. n& u6 ~1 w) @* q! q0 r3 g+ g) p9 v) q

    7 h: v5 [% h. `! W) K% I$ }我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
    . t9 M6 t8 [% k! C4 Q+ V( x7 p! q% O+ {
    二、代码块
    & \6 }( j6 T! v, fPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的* u6 O4 m+ ~' Z# M$ W

    0 Y$ ?& B9 m  D- h+ g7 ]代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块" [1 [9 |7 w% p/ R+ |

    " M' _& W, F  w: e4 g而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
    0 Y0 N- a6 p$ g3 M( f; I  r7 {) o
    8 q6 K) c/ W* `5 U2 R8 V) ~; p( [. X( v2 Q5 _
    而对于同一个文件中的两个函数,也属于两个分别的代码块:
    % D/ c2 d9 l" S2 R  I; u. K" P9 V9 y
    5 }# A7 b( {" k: S+ A
    8 f/ v' w2 j/ X# A代码块的缓存机制: c5 y( @2 b' v: W9 b; A
    前提条件: 同一代码块5 ^) o5 ^" W& f& Q8 R

      _) o' O( l  m% w) z0 n机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。# W7 F, {* a& j  R' w

    0 j2 J. ?/ d5 X- u" s& w/ n' J  M
    8 ], |& b, l/ n8 m0 Z. t# F2 \+ t, J' P9 n6 H; o) N
    2 l- \! s3 I- V) S# i; i
    上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
    ) G' ^0 b: d: ]0 b" f
    ' S# E4 b, H4 b: d5 C+ n  }& G适用对象: int(float),str,bool
    1 @$ W* n1 d9 _9 ^
    ; I# \4 {" t( B- m( \$ s对象的具体细则:
    5 ^( w& {& K' s, `7 e- b, L, N  e0 m6 b) J( v0 s! V
    int(float):任何数字在同一代码块下都会复用/ S' D4 U- y% ~7 n: K4 X0 \
    bool:True和False在字典中会以1,0方式存在,并且复用
    ! j" y5 M. X0 M+ R( j0 ~str:几乎所有的字符串都会符合缓存机制
    ( u+ D. d: q+ P4 x, ^: e8 F# U& r6 _非乘法得到的字符串都满足代码块的缓存机制1 I' M) a' G! S4 }, k
    乘法得到的字符串
    7 _! [0 `* K! _6 [3 ~0 H- m乘数为1时,任何字符串满足代码块的缓存机制
    + }+ t4 V* h3 M: L乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制/ n8 \2 d/ _( F% @
    优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
    / E: E/ r( p7 C! o# m% x( O' o- o* n

    8 }% ], \1 ~9 g! L
    1 E8 r( U- X" h$ ?1 h2 T, {三、小数据池
      `6 Q  b. W% {! V% `前提条件: 不同代码块内。% O/ G3 J( P+ e6 k( }+ {9 x

    + ^1 G# I6 _# M7 B, p. G6 y适用的对象: int bool str5 r& o! u3 E. i; p9 J" ]& y
    # w8 g  a+ Y0 y2 ^! W9 n) W$ G
    具体细则:
    : M1 P% J/ s1 I1 }6 x
    : X  Y& P1 s/ Z4 c" w- Tint(float):-5~2567 C5 D+ r' B# N8 K" V: l8 _# Z' ]
    bool:True和False在字典中会以1,0方式存在,并且复用
    / ~. V  s  w/ xstr:满足规则的字符串
    & N2 f% q  l5 `$ G& |1 q% k. e字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
    " G9 ?0 ?! u) }' \# E( I
    , T4 `" Q; o) a: O8 H) s( _! s字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留3 U4 h7 L- l. n+ L# P3 a) w

    ! u6 n5 K7 }/ A* M4 K3 n: U9 T用乘法得到的字符串: s2 N6 B! H/ R" |) B" W2 h' Y
    乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
    & g* z0 @2 y4 I7 |* s% C% l# ?' G$ Y
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    2 ?  g0 h9 v3 f
    , Q$ q$ z) j! _9 t
    : m5 `3 I4 Y+ R2 H7 K! G
    : P3 j/ c+ {/ ^" {+ F3 O四、总结: u0 p$ x7 k# P
    判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==  n" w, Z# j) ?3 r
    同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
    ( w+ @) K. |: H' s7 Y————————————————0 X6 q* h6 L: q7 \; q8 A
    版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 F' Q) F5 H: }. p原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842  B6 j; J+ ~2 F8 U3 _
      t4 X6 s5 b. B2 _  I9 P  [
      n3 D2 ~+ S  |' u
    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-9-22 21:34 , Processed in 0.334009 second(s), 50 queries .

    回顶部