QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4115|回复: 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,==5 T/ c/ ?! q1 X4 X/ `1 Z- Z) n9 r
    Python中一切皆对象。对象包含三个要素,id、type、value。
    : b/ `3 q  {  g- V& D
    - b6 d% C( y' Q# t' D' {id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。
    " ]1 {% F* `% H) u( K  N7 m0 L5 q7 _7 _( m
    type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。2 t0 F$ f, _1 Q8 z* Y7 g. f
    / }7 _" J: D0 Q; F! p; W0 w
    value 是对象指向的内存地址中存放的具体的值。; U7 z  @+ N2 b& _. ^/ ]
    & U) @8 T( j- d
    因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“4 R0 D4 C  Z% c2 U) ?+ T$ b; x

    ' S1 g6 B$ y) A# Mis 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同5 z3 ]% O& U4 K7 o4 U, L3 H- \3 Q

      m3 |' l$ q0 s" ?  ]3 B% |% L( @7 \- E+ X) h  d
    我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。$ {4 ^" j: F% S: j" q- L+ y- ]

    ! U# _( }8 F% b  p8 G( ?二、代码块
    + p2 ]6 x/ S' S" U9 u4 X! [& OPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的; R' r0 C* _, f, @' @) t( W

    ; C. e9 I# H- C, X代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
    ) n8 W) n7 F# _, ?, D1 u: Y7 ?% {
    而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
    ' R- l1 g, H. N
    - V- c3 L2 {( `5 z2 ^
    8 d( F$ ]" Q' S; w' Y5 {6 _而对于同一个文件中的两个函数,也属于两个分别的代码块:) V. J" B$ _1 r: s8 K& Q

    + \0 Y0 D. ?1 G5 q0 S8 I- M7 w- H2 a- U$ `9 h4 `  k
    代码块的缓存机制* |; B6 s. E  n) U6 o
    前提条件: 同一代码块
    ) m( X/ }" O; c+ y/ T7 c) p; ?7 v$ J" J* G
    机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。: q& R: {5 ?. R3 t9 J  u# _$ A" f
    , i0 D9 A/ {1 W3 k9 I, ^

    8 t- k% y1 Z! U
    ' D9 _, k, ?$ q) M! d0 D: z3 t) g
    上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象2 s- p$ ~" s! C) Q
    8 G1 l4 L) E8 M, F# F5 ^8 A
    适用对象: int(float),str,bool! O" a" M, A8 q
    0 \; ]+ @6 a" t3 D+ B9 q
    对象的具体细则:
    % P/ m9 A  `) t; w6 p) j
    $ q6 e! i" ^" z3 p1 gint(float):任何数字在同一代码块下都会复用
    8 t% Y: O$ h1 ]$ Z1 n7 X+ t! n- Qbool:True和False在字典中会以1,0方式存在,并且复用1 s! a7 S# F* ^
    str:几乎所有的字符串都会符合缓存机制$ L+ J; v, Y8 [/ @
    非乘法得到的字符串都满足代码块的缓存机制8 P# G  z  p1 M' @5 E+ k
    乘法得到的字符串8 K7 v* }! w% R) [0 G1 o7 P! J/ G( ?
    乘数为1时,任何字符串满足代码块的缓存机制
    ( O8 T* k  u: O3 V; t乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    0 w3 G  o0 f+ }) F. R- }优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存/ Q2 r6 x% W! V( o: T. O- ^
    ' |6 f& x8 i, t! J* l

    ( ?) `, {$ J" y2 @5 W* j. ]( K( j& u
    . P: @. w( ]  }7 w* C: z三、小数据池9 V0 i% {+ z' X  n1 G- I' X% s
    前提条件: 不同代码块内。  [' X6 U& ?( J: v
    3 r+ P3 b( i) k. m9 w) N
    适用的对象: int bool str
    $ Q* Q( }( M: d/ y, P' d; D/ r  K! G5 f( A$ l4 a+ u" O
    具体细则:
    9 `; K, \5 w% B, W! m9 c4 d" O
    int(float):-5~256
    ! X2 J0 W  s/ W+ b- [& D* ebool:True和False在字典中会以1,0方式存在,并且复用* P. g9 D. r* b) T$ i; U% C9 G! M+ e
    str:满足规则的字符串
    # Y0 f) F; c- g; Y( `( i字符串的长度为0或者1,默认都采用了驻留机制(小数据池)4 k! g- a( p  k, c& X0 Q

    5 q% z( {$ J$ ?( d5 h8 p字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留
    ) \0 P, V& c* Y' a$ m% n2 l5 w! m  s- P  b
    用乘法得到的字符串* E+ L9 I* Q$ q
    乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
    8 `+ ]  C- Z0 m& _# k! H, e* z6 D7 u  a3 z& L$ K
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    : d1 d9 i( f+ w0 `/ S; |# }5 \2 e! n" Q* T8 C

    * ?) n4 M# i3 z- |" h7 U' O7 M7 }
    四、总结& K2 P0 q! k% c! y
    判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==6 g, G% ?/ f; X/ P, ^( X6 A) M
    同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)$ a* }& \( R6 i
    ————————————————3 ]# }' c: F) r% b! p9 J3 @
    版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ A- S3 W0 \4 q# |! ]! L( h  E5 H
    原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
    & U  ]5 Z$ X; G: t1 i- c! T) u; _
    9 u3 j/ q1 o: q  c2 k1 Q. x( G7 y6 t, r" Y2 D4 R: }% E- }  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-8-8 02:40 , Processed in 1.029060 second(s), 50 queries .

    回顶部