Если я правильно понимаю, я могу повысить производительность функции numba, добавив подпись.
Это неправильно - или только частично правильно. С помощью сигнатуры numba просто скомпилирует функцию заранее, а не при первом вызове с этими аргументами. После первого звонка оба должны быть одинаково быстры. В некоторых случаях функция может быть немного быстрее без подписи (особенно с массивами, где numba может использовать выравнивание массива ввода).
Теперь у меня есть функция, которая принимает два набора. Какая правильная подпись?
Правильная подпись для набора Python, содержащего целые числа:
numba.types.Set(numba.int64, reflected=True)
Таким образом, подпись для функции, принимающей два набора (и возвращающих один), будет:
import numba as nb
reflected_int_set = nb.types.Set(nb.int64, reflected=True)
@nb.njit(reflected_int_set(reflected_int_set, reflected_int_set))
def f(set_1, set_2):
return set_1
>>> f({1,2,3}, {3,4,5})
{1, 2, 3}
Но поскольку это (очень вероятно) не улучшает производительность, я бы вообще не стал беспокоиться о подписи.
Также предостережение: numba преобразует набор Python во внутренний набор numba, поэтому передача Python set
в функцию numba или возврат set
из функции numba в контекст Python скопирует полный набор , В большинстве случаев эти накладные расходы гораздо более значительны, чем потенциальные ускорения, которые обеспечивает numba.
По моему опыту set
s и list
s с numba имеют смысл, только если они строго ограничены функциями numba. Поэтому, если вы используете их в качестве аргументов или возвращаете их (для функций / контекстов, отличных от numba), вы должны измерить производительность и проверить, действительно ли вы получаете ускорения.