QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3405|回复: 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,==
    ; u+ c" G; S! _7 z) s; Q+ VPython中一切皆对象。对象包含三个要素,id、type、value。
    * w6 ]/ j6 |. V8 b
    0 \* _9 v4 O: i( Wid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。3 b6 l& w7 I. o) ?) K, m' D
    ) G; N0 ]# n* T/ I/ {
    type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
    - Y0 ?/ V; n" ]7 s! u# E: i. u' A- b
    value 是对象指向的内存地址中存放的具体的值。
    % l2 K: _# \( Y( g  d4 B4 Y8 d- X5 l) w; U4 O1 J0 x
    因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“- O1 h( `/ ?) U) b/ ^

    3 o! A0 X$ m4 c6 W: Iis 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
    0 m4 H+ \+ l1 h7 D; Z7 I, `8 V' d" A8 ?- T: V" Z

    ; e4 Y4 g' X. F" p& |/ U我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。: G# T5 c! e8 [/ P! O

    ' i- C/ m0 S- e  l二、代码块$ b6 s) H! {1 y
    Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的7 K2 w( i: z% g! N+ S9 [% H' ~$ N
    " e$ J/ r: v$ d& [+ r) P
    代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块1 ^) U  a' U5 T. \, H
    # j& j( c+ R" f
    而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
    7 x: O+ _+ O( C" k, N7 D% ~# ?! o6 j" M

    + J( Q. j5 C2 s( C3 @  O# ?而对于同一个文件中的两个函数,也属于两个分别的代码块:- ?) g% g2 O' t: S% L
    : C4 M9 b9 h" |  ^+ ^! t( S
    , A2 r; |- w0 C
    代码块的缓存机制
    # j1 _7 U( s8 P- U: t1 U8 N前提条件: 同一代码块
    8 P2 _6 N2 A! B2 j+ n1 Z( T; D' m0 k0 ~. K3 U) B6 H$ i& g" z2 a( L+ w/ S
    机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
    * ?* L7 h) S# M: {/ m! s% y1 S% o  ^& h

      e; G. Z) u% D5 T" |
    . o) t2 P: L& {3 v. S
    9 S$ F9 \9 v* m  F- l上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
    . N" K9 Y7 c: n- Z0 `* u
    ' V" L6 A! Z) p* G) V# q: @) ]适用对象: int(float),str,bool
    , u: ?( B. m  [! N- t7 S7 W" i+ W5 ^: K: o5 X, M" p
    对象的具体细则:
    8 E' ]( {. |+ f2 b& t0 m
    % o: N: Q( g# @( Y& L& [int(float):任何数字在同一代码块下都会复用, |) l- b5 G4 n' A& S
    bool:True和False在字典中会以1,0方式存在,并且复用
    + w8 i6 V9 x+ n9 M: `str:几乎所有的字符串都会符合缓存机制$ Q; _0 ]8 v5 M) a
    非乘法得到的字符串都满足代码块的缓存机制
    + Z0 R7 ~. F6 [- C5 d% t/ L! j$ l乘法得到的字符串
    3 B6 M' B0 D# ]; f9 X乘数为1时,任何字符串满足代码块的缓存机制5 ~5 U( q- S) E. E. I
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制$ _) K3 A( f) d' u9 x* }" g, Y/ S
    优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
    6 t) z- x* D; T
    . ], e8 q- r* R
    & F  A) a7 Y7 A3 T% ~) C: q# A/ k, h) `8 D" ]
    三、小数据池  A7 j$ }: N/ e
    前提条件: 不同代码块内。  d, e: ~4 F& O, I. a# J' A
    ( ]3 n+ |1 b% I& w) c
    适用的对象: int bool str
    6 P# `8 b' j0 b3 ]7 I5 m/ P  @% p/ Y$ H, m6 P( ^
    具体细则:9 K% H4 F5 [6 f( X2 t" Y" _8 K
    5 m( d* q/ ]8 p2 f. k
    int(float):-5~256
    - p- D- k- Y- n6 h7 Dbool:True和False在字典中会以1,0方式存在,并且复用
    9 e8 @" _% t1 \" r" ostr:满足规则的字符串
    5 q: N. {# ?( y. q$ Y4 R# i0 u字符串的长度为0或者1,默认都采用了驻留机制(小数据池)9 G& S( `  D$ |8 |2 f: m
    ' Z. l) a4 D- V
    字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留. O- ^8 r' a5 t3 Q* v& \- R1 F
    & B+ d  A+ c) W  y
    用乘法得到的字符串4 l0 s# J% O7 G6 S
    乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
    0 n7 d/ Q( z" ?4 m$ e; I* a6 a% v6 a& U$ C2 D9 M3 F
    乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
    ' k# A4 E) S$ U3 K( R1 I6 Z( G3 P, Q9 }

    " t$ _7 c' ]. ]: K( b  ?# v, }& c2 H9 n4 l( m5 s5 m
    四、总结% E) |+ s+ j  U. [
    判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==
    9 v: T2 A: }1 q) _同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
    , {  n. K+ y1 X% v————————————————" v" {, N7 e! U/ F5 N2 E
    版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ! J" v, ~5 e' g* s  a+ I原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
    7 v8 E" N; b9 O, j4 Z
    ) N# s' i! S0 N' J# A7 D+ |: I  e
    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, 2025-8-18 19:24 , Processed in 0.494446 second(s), 50 queries .

    回顶部