Какая правильная сигнатура для множеств в джумбированных функциях numba? - PullRequest
2 голосов
/ 22 марта 2019

Если я правильно понимаю, я могу повысить производительность функции numba, добавив подпись.Пример:

@njit(int32(int32, int32))
def f(x, y):
    # A somewhat trivial example
    return x + y

Теперь у меня есть функция, которая принимает два набора.Какая правильная подпись?

@njit(int32(set(int32), set(int32)))
def f(set_1, set_2):
    # A somewhat trivial example
    return x

Я думал, что подпись (int32(set(int32), set(int32))) может быть правильной, но ничего не происходит.print(numba.typeof(set_1)) возвращает reflected set(int32)

1 Ответ

2 голосов
/ 24 марта 2019

Если я правильно понимаю, я могу повысить производительность функции 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), вы должны измерить производительность и проверить, действительно ли вы получаете ускорения.

...