Как numba-реализация str.find () может быть медленнее, чем чистая python? - PullRequest
0 голосов
/ 07 мая 2020


Как такое может быть, что чистый python код str.find () быстрее, чем его реализация 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)

1 Ответ

2 голосов
/ 10 мая 2020

Встроенная CPython реализация str.find не является «чистой Python» - она ​​уже записана в C: https://github.com/python/cpython/blob/master/Objects/stringlib/find.h

Это не то, чего мы ожидаем от Numba. В самом деле, поскольку у Numba есть и другие проблемы, с которыми нужно справляться, неудивительно, что она работает немного медленнее. См. Следующее «предупреждение» в документации Numba , последнее предложение я выделил жирным шрифтом для выделения:

Известно, что производительность некоторых операций ниже, чем CPython реализация. К ним относятся поиск подстроки (in, .contains() и find()) и создание строки (например, .split()). Повышение производительности строки - постоянная задача, но скорость CPython вряд ли будет превышена для работы со строкой basi c изолированно. Numba наиболее успешно используется для более крупных алгоритмов, в которых используются строки, где базовые c строковые операции не являются узким местом.

По сути, разработчики Numba добавили строковые методы в no python, чтобы пользователям, у которых может быть несколько строк кода, включающих строки, смешанные с тяжелым числовым кодом, было бы проще скомпилировать свой код без какой-либо переделки. Но Numba не предназначена для ускорения строкового кода: ее цель - тяжелые числовые функции, а поддержка строк предназначена только для удобства.

...