str.find()的numba实现怎么会比纯python实现慢呢




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实现慢。其中包括子字符串搜索(in.contains()find()(和字符串创建(如.split()(。提高字符串性能是一项持续的任务,但CPython的速度不太可能被孤立的基本字符串操作所超越Numba最成功地用于碰巧涉及字符串的较大算法,其中基本的字符串操作不是瓶颈

基本上,Numba开发人员在nopyson模式中添加了字符串方法,这样用户就可以更容易地编译代码,而无需重新设计。但Numba并不是为了加快字符串代码的速度:它的目标是重载数字内容,而字符串支持只是为了方便。

最新更新