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个字符串.

  • 相关阅读:
    预分频之三
    MySQL超时配置
    随机森林深入理解
    决策树算法——ID3
    指数平滑法
    最小二乘法的Java实现
    JS实战
    CSS布局实战
    Win7 Python开发环境搭建
    神经网络正向传播与反向传播公式
  • 原文地址:https://www.cnblogs.com/sigai/p/7442095.html
Copyright © 2011-2022 走看看