簡體   English   中英

str.find() 的 numba 實現如何比純 python 慢?

[英]How can numba implementation of str.find() be slower, than the pure python one?


怎么可能,str.find() 的純 python 代碼比它的 numba 實現更快?
numba==0.48.0 (0.49.0 無法加載,似乎有問題)

from timeit import default_timer as timer
from numba import jit,njit

def search_match(a,search,n):
   for z in range(n):
      i = a.find(search)
   return i

@njit
def search_match_jit(a,search,n):
   for z in range(n):
      i = a.find(search)
   return i

n = 10000000
a  = '.56485.36853.32153.65646.34763.23152.11321.65886.54975.12781.'
search = '2315'

print('Str.find:')
start = timer()
i = search_match(a,search,n)
print(timer() - start)

i = search_match_jit(a,search,1) # precompile
print('Jit:')
start = timer()
i = search_match_jit(a,search,n)
print(timer() - start)

str.find的內置 CPython 實現不是“純 Python”——它已經用 C 編寫: https://github.com/python/cpython/blob/master/Objects/stringlib/find.h

這不是我們期望 Numba 加速的事情。 確實,由於 Numba 有其他並發症需要處理,所以速度慢一點也就不足為奇了。 請參閱Numba 文檔中的以下“警告”,其中我將最后一句加粗以強調:

已知某些操作的性能比 CPython 實現要慢。 其中包括 substring 搜索( in.contains()find() )和字符串創建(如.split() )。 提高字符串性能是一項持續的任務,但是對於孤立的基本字符串操作,CPython 的速度不太可能被超越。 Numba 最成功地用於碰巧涉及字符串的大型算法,其中基本的字符串操作不是瓶頸。

基本上,Numba 開發人員在 nopython 模式中添加了字符串方法,以便用戶可以更輕松地編譯他們的代碼,而這些用戶可能有幾行代碼,碰巧涉及字符串與繁重的數字代碼混合在一起,無需任何重新設計即可編譯他們的代碼。 但是 Numba 並不是為了加快字符串代碼的速度:它的目標是繁重的數字內容,而字符串支持只是為了方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM