Какой тип данных рекомендуется использовать для входа и выхода из функций Numba? - PullRequest
0 голосов
/ 08 января 2019

Мне было интересно, какой тип данных рекомендуется передавать в функции numba и из них. В примерах (https://numba.pydata.org/numba-doc/dev/user/examples.html), я вижу такие вещи, как:

def create_fractal(min_x, max_x, min_y, max_y, image, iters):

но я обычно работаю со словарями параметров или чем-то в этом роде.

params={'min_x':0,'max_x':100,'arr':rand(5),....}

я должен использовать Jitclass? Что-то другое? Есть ли что-то с большей глубиной, чем 1? Я думаю, я ищу эквивалент c-структуры, или то, что numba увидит как c-struct.

спасибо!

1 Ответ

0 голосов
/ 12 января 2019

Что касается входных данных, функции Numba со связью принимают неупакованные аргументы ключевых слов, и в моем ограниченном опыте, похоже, не слишком много снижается производительность за их использование. Например, если я напишу

@njit
def f(x, y, z):
    return x + y - z

x, y, z = np.ones(100), np.zeros(100), np.full(100, 4.)
vals = {'x': np.ones(100), 'y': np.zeros(100), 'z': np.random.rand(100)}

затем, после первого запуска для компиляции, я получаю времена:

In [8]: %timeit f(**vals)
1.41 µs ± 17.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [9]: %timeit f(x, y, z)
1.44 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Я предполагаю, что dicts - ваш лучший / самый легкий вариант здесь, если, возможно, вы не будете выполнять кучу крошечных вызовов функций, а перегрузка функций станет главной.

Если вы хотите выводить материал в формате dicts, а не конвертировать его самостоятельно, это немного сложнее, так как я не думаю, что он еще поддерживается в режиме nopython. Возможно, в этот момент накладные расходы станут настолько существенными, что jitclasses будут иметь смысл.

...