QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4073|回复: 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,==+ e/ ]1 Z2 h$ @- r$ n6 t
    Python中一切皆对象。对象包含三个要素,id、type、value。
    " X) a7 S: _. i# V
    7 H5 X! u, [' ^3 _% xid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。6 _! _. J( R* n7 T  q+ {& L; J3 Q

    7 {. t1 i( @4 dtype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
    ; A- w8 K! ?. {4 w8 n" d* R4 k5 Z/ N# K9 j
    value 是对象指向的内存地址中存放的具体的值。5 B6 L6 }8 \6 G2 v0 d0 y

    7 W3 y% `0 G* X因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“4 r% \0 G" m. `5 }$ J0 E0 O
    2 y4 K& M2 N  t
    is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同: Z; n2 }& s; ]" w: ]5 F: A" V
    ) G. Y* h) [: V, m5 T
    . @) F4 E. J: [% F9 j5 `
    我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。* r/ u1 c4 ]. n- x
    / M! n) D( \$ l
    二、代码块. b/ T9 F3 r, L. A* M+ \
    Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的1 v$ H( D. S, \. L' D- i. l
    0 p! ~* I7 r* @9 p$ D
    代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
    0 U  C) K5 W/ K8 C3 {" ?7 z
    3 b7 I2 t. Z0 I" f. a. S! ]而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
    ; N* b; E( C9 [5 f: f/ r0 G2 B% c% G! J, o( d1 L
    ; {+ c& `" U1 p; M# x
    而对于同一个文件中的两个函数,也属于两个分别的代码块:
    ; @; p5 b( z) G2 {, P: P, `) K
    8 i: w& U* G' Z# n% o3 N3 `. b$ J4 ?0 c1 s' d
    代码块的缓存机制
    5 m/ H) ]" P* M* Q9 u1 c, b0 g前提条件: 同一代码块
    , S, |$ M/ \4 @8 o# `, X  r' R: b6 e- w* B8 Q5 p, J# o1 b
    机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。" V7 S, J# [% i  H

    : {: _3 x% l- o  s5 d, G6 g0 F. B) [4 ^% j( E* r

    , O' @& s( X" M9 K2 i0 U$ W1 K6 a/ B3 U" z& h3 a, f$ g% o8 S
    上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
    0 [+ I$ ~, A* ~& O( K4 J% t  @, ]! j" E  ]) u
    适用对象: int(float),str,bool  S2 p, u1 U' V" ~

    0 R/ F: w. G4 c2 \& V对象的具体细则:4 f+ y4 `* j' d

    & p% c- h  `3 eint(float):任何数字在同一代码块下都会复用) `$ Y8 _- o) P. @
    bool:True和False在字典中会以1,0方式存在,并且复用& B0 O; [5 @7 h% h, U4 Z8 F7 d7 C* ~  p. e
    str:几乎所有的字符串都会符合缓存机制
    5 D3 \' i; F# @7 i* u* o# D/ ~; B: n非乘法得到的字符串都满足代码块的缓存机制+ _  r9 h$ P& \7 z
    乘法得到的字符串8 U  H5 q( f, m% |
    乘数为1时,任何字符串满足代码块的缓存机制  }" i% _4 y* q6 c0 y' j
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制9 v$ R1 P1 Z3 D4 X
    优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
    % ?7 n3 ^. Z; R, z7 N: C3 L
    $ I' y$ w: P, K3 J9 q0 R( z. F" o& Q

    + C& s2 U. d8 Z+ }0 L三、小数据池
    : a+ `" ~8 h6 u前提条件: 不同代码块内。8 q% F0 t& y, K
    * q2 I) W, B& G6 }, c
    适用的对象: int bool str! P0 F: m2 F9 y) D# T+ W
    3 ^& M5 J7 ~! D3 V0 @$ n
    具体细则:8 Q# w$ [$ G! f* F8 t6 V

    9 x/ w, `6 D# `$ Hint(float):-5~256# `8 f0 i! R; S( }: m0 m( V
    bool:True和False在字典中会以1,0方式存在,并且复用  ^6 A1 o+ z' Q# I
    str:满足规则的字符串
    + }) M: q- s# u) }* y- x字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
    * Z" p1 Q* K2 Y7 P, E
    2 a9 q9 @2 _$ ]  ^, v% c! G/ ^' p* c! ]字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留  h% y0 ?. j# s( o9 p
    : b7 a3 p* w+ `# `2 N$ ?* P
    用乘法得到的字符串
    # [2 r! Z% p( B乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
    & D) o. N% _1 C  I+ Y3 N" z
    + }5 q/ o4 y4 L. ?) H- i乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    1 ?7 W7 d# s) r% L4 @
    - m4 f% j2 F& H$ m6 ], G: A% z
    % m) Q! i- o/ w
    9 q1 Q; T" t: q. [四、总结9 N4 M. c; |5 _& y4 k2 u
    判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==9 x8 j' o* Q3 z
    同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
    : f$ c  E; V. p# Z————————————————% J4 L' A/ r3 b, w* K" v
    版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ b  b, y6 }' ^& S; ?
    原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842! _5 F' u5 s" a4 z

    ; s; v5 Z  S. j8 e+ T  a4 C* L4 x3 T# @# T, O& x8 h
    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-6-15 03:42 , Processed in 0.386036 second(s), 51 queries .

    回顶部