首页 > 解决方案 > 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)

标签: pythonnumba

解决方案


内置的 CPython 实现str.find不是“纯 Python” - 它已经用 C 语言编写:https ://github.com/python/cpython/blob/master/Objects/stringlib/find.h

这不是我们期望 Numba 加速的事情。确实,由于 Numba 有其他并发症需要处理,所以速度慢一点也就不足为奇了。请参阅Numba 文档中的以下“警告” ,其中我将最后一句加粗以强调:

已知某些操作的性能比 CPython 实现要慢。这些包括子字符串搜索 ( in,.contains()find()) 和字符串创建 (like .split())。提高字符串性能是一项持续的任务,但是对于孤立的基本字符串操作,CPython 的速度不太可能被超越。Numba 最成功地用于碰巧涉及字符串的大型算法,其中基本的字符串操作不是瓶颈。

基本上,Numba 开发人员在 nopython 模式中添加了字符串方法,以便用户可以更轻松地编译他们的代码,而这些用户可能有几行代码碰巧涉及字符串与重型数字代码混合在一起,而无需重新设计。但是 Numba 并不是为了加速字符串代码:它的目标是繁重的数字内容,而字符串支持只是为了方便。


推荐阅读