zoukankan      html  css  js  c++  java
  • [Python源码剖析]字符缓冲池intern机制

    static PyStringObject *characters[UCHAR_MAX + 1];
    ...
    
    /* This dictionary holds all interned strings.  Note that references to
       strings in this dictionary are *not* counted in the string's ob_refcnt.
       When the interned string reaches a refcnt of 0 the string deallocation
       function will delete the reference from this dictionary.
    
       Another way to look at this is that to say that the actual reference
       count of a string is:  s->ob_refcnt + (s->ob_sstate?2:0)
    */
    

      Python源码[Object/stringobject.c]中UCHAR_MAX = 255.

    所以Python解释器会缓冲256个字符串, 第257个字符串多次赋值不同的变量名, id()查看的结果就不同了:

    >>> len(locals().keys())
    4
    >>> for i in range(256):
    ...     locals()['a%s'%i]= str(i)
    ...
    >>> len(locals().keys())
    261
    >>> a='247'
    >>> id(a247)
    4301254088
    >>> id(a)
    4301235264
    >>>
    

      可见intern机制可以缓存256个PyStringObject对象. 前三章看完了, 就主要两个知识点, 小整数集合范围[-5, 257), 字符缓冲池intern机制缓存256即0xff个字符串.

  • 相关阅读:
    bzoj 1295 [SCOI2009]最长距离 最短路
    bzoj 3669 [Noi2014]魔法森林
    bzoj 1432 [ZJOI2009]Function 思想
    用JSP输出Hello World
    Web开发基础
    JSP相关背景
    JSP概述
    Java视频播放器的制作
    为JFileChooser设定扩展名过滤
    使用JFileChooser保存文件
  • 原文地址:https://www.cnblogs.com/sigai/p/7442095.html
Copyright © 2011-2022 走看看