作家
登录

深入了解Python字符串对象的实现

作者: 来源: 2017-06-13 15:03:15 阅读 我要评论

“mask” 是一个 32 位的位掩码(bitmask),将其最低的 5 个特点位作为开关位。钙揭捉?码是经由过程和模式串 “p” 进行操作产生的。它设计成一个布隆过滤器(bloom filter),用于检猜一?字符是否涌如今当缁ぶ符串中。这种机制使查找操作十分敏捷,然则存在伪正的情况(false positives)。关于布隆过滤器,你想有更多懂得的话可以看看 这里 。对于本例,下方说清楚明了位掩码具体是若何产生的。

  1. mlast = m - 1 
  2.  
  3. /* process pattern[:-1] */ 
  4.  
  5. for (mask = i = 0; i < mlast; i++) { 
  6.  
  7.     mask |= (1 << (p[i] & 0x1F)); 
  8.  
  9.  
  10. /* process pattern[-1] outside the loop */ 
  11.  
  12. mask |= (1 << (p[mlast] & 0x1F));  

字符串 “p” 的第一个字符为 ‘a’。字符‘a’的二进制表示为 97 = 1100001。保存最低的 5 个特点位,我们获得了 00001,是以变 “mask” 初次被设定为 10(1 << 1)。当全部字符串 “p” 都经由处理后,mask 值为 1110。那么,我们应当若何应用这个位掩码呢?经由过程下方这行代码,我们用其来检测字符 “c” 位于字符串 “p” 哪个地位。

  1. if ((mask & (1 << (c & 0x1F)))) 

下面,看下查找操作的轮回部分(真实代码为 C 实现,而非 Python):

  1. for i = 0 to n - m = 13: 
  2.  
  3.     if s[i+m-1] == p[m-1]: 
  4.  
  5.         if s[i:i+mlast] == p[0:mlast]: 
  6.  
  7.             return i 
  8.  
  9.         if s[i+m] not in p: 
  10.  
  11.             i += m 
  12.  
  13.         else
  14.  
  15.             i += skip 
  16.  
  17.     else
  18.  
  19.         if s[i+m] not in p: 
  20.  
  21.             i += m 
  22.  
  23. return -1  

“s[i+m] not in p” 这行测试代码是基于位掩码实现的,“i += skip” 便对应坏字符跳跃。当主串下一?待匹配的字符在 “p” 中并未找到时,则履行 “i += m” 这行代码。

  1. 1>>> s1 = 'abc' 

有关Python字符串对象完全的代码实现, 去这里看看(http://svn.python.org/projects/python/trunk/Objects/stringobject.c) 。

【编辑推荐】

  1. Python爬虫神器PyQuery的应用办法

      推荐阅读

      还敢闯红灯?“人脸识别”分分钟让你变“网红”

    大年夜家都知道闯红灯是违法的,但几乎每小我都闯过红灯,为什么?就因为违法成本低、很少有人管,并且即便闯了也很难被及时发明。对闯红灯行动现场抓拍不过跟着人脸辨认技巧的成长,这个>>>详细阅读


    本文标题:深入了解Python字符串对象的实现

    地址:http://www.17bianji.com/lsqh/35733.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)