python原始碼查詢子串

2021-06-03 15:56:28 字數 2302 閱讀 7195

首先找到string.find定義的地方, 在objects/stringobject.c:

static pyobject *

string_find(pystringobject *self, pyobject *args)

py_local_inline(py_ssize_t)

string_find_internal(pystringobject *self, pyobject *args, int dir)

stringlib_find_slice 定義在 objects/stringlib/find.h:

py_local_inline(py_ssize_t)

stringlib_find_slice(const stringlib_char* str, py_ssize_t str_len,

const stringlib_char* sub, py_ssize_t sub_len,

py_ssize_t start, py_ssize_t end)

py_local_inline(py_ssize_t)

stringlib_find(const stringlib_char* str, py_ssize_t str_len,

const stringlib_char* sub, py_ssize_t sub_len,

py_ssize_t offset)

fastsearch 定義在 objects/stringlib/fastsearch.h, 先是些巨集定義:

#if long_bit >= 128

#define stringlib_bloom_width 128

#elif long_bit >= 64

#define stringlib_bloom_width 64

#elif long_bit >= 32

#define stringlib_bloom_width 32

#else

#error "long_bit is smaller than 32"

#endif

#define stringlib_bloom_add(mask, ch) \

((mask |= (1ul << ((ch) & (stringlib_bloom_width -1)))))

#define stringlib_bloom(mask, ch) \

((mask & (1ul << ((ch) & (stringlib_bloom_width -1)))))

stringlib_bloom 和 stringlib_bloom_add 這裡是構建了乙個字元的bloom-filter, stringlib_bloom_add簡單來說就是 mask =| 1 << int(ch), stringlib_bloom 是 mask & ( 1 << int(ch) )

具體的實現:

py_local_inline(py_ssize_t)

fastsearch(const stringlib_char* s, py_ssize_t n,

const stringlib_char* p, py_ssize_t m,

py_ssize_t maxcount, int mode)

else

return -1;

}mlast = m - 1;

skip = mlast - 1;

mask = 0;

if (mode != fast_rsearch)

/* process pattern[-1] outside the loop */

stringlib_bloom_add(mask, p[mlast]);

for (i = 0; i <= w; i++)

/* miss: check if next character is part of pattern */

if (!stringlib_bloom(mask, s[i+m])) //不匹配,且下乙個字元不是子串中字元

i = i + m; //直接跳過整個子串長度

else

i = i + skip; //下一字元是子串字元,跳過skip個字元

} else

}} else

if (mode != fast_count)

return -1;

return count;

}

從原始碼看來,string.find使用的是簡化bm演算法,雖然某些場景效率不是最高,但勝在實現簡單,效能也不錯。

快速查詢子串演算法KMP原始碼

kmp演算法最難理解的就是它的next陣列的求法。個人理解就是當模式串 pattern string 某個位置和主串不匹配時,將模式串的當前的位置從字首位置轉移到對應的字尾位置。位置0 1234 56字元a baba bbnext 未優化 10 0123 4next 優化後 10 10 10 4未優...

python原始碼剖析 Python原始碼剖析

第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...

90 70 010 原始碼 CUBE查詢 原始碼

注 kylin原始碼分析系列基於kylin的2.6.0版本的原始碼,其他版本可以模擬。kylin中的查詢是在web頁面上輸入sql語句然後提交來執行相關查詢,頁面上的提交也是向kylin的rest server傳送restful請求,方法與前面文章介紹的cube構建的觸發方式類似,通過angular...