Вложенная функция Numba не будет выполняться (версия 0.47) - PullRequest
0 голосов
/ 20 января 2020

Я не понимаю, почему это не работает, в документах говорится:

2.6.1.2.3. Внутренняя функция и замыкание: теперь Numba поддерживает внутренние функции, если они нерекурсивны и вызываются только локально, но не передаются в качестве аргумента или не возвращаются в качестве результата. Также поддерживается использование переменных замыкания (переменных, определенных во внешних областях) во внутренней функции.

import numba

@numba.jit(nopython=True, debug=False, parallel=False, cache=True)
def outer() -> int:

    @numba.jit(nopython=True, debug=False, parallel=False, cache=True)
    def inner() -> int:
        return 1

    return inner()

outer()

И ошибка:

Failed in nopython mode pipeline (step: analyzing bytecode)
op_MAKE_FUNCTION with annotations is not implemented

Я делаю что-то глупое здесь?

(ОС: Ubuntu 19.10)

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Soln: не использовать объявления типов и удалить внутренний JIT-декоратор

0 голосов
/ 20 января 2020

Как прокомментировал Green Cloak Guy, сначала удалите подсказки типа. Тогда, хотя я не смог найти его в документах, я думаю, что вам просто нужно украсить внешнюю функцию, на что указывает следующее сравнение timeit:

import numba

@numba.jit(nopython=True, debug=False, parallel=False, cache=True)
def outer():
    def inner():
        for i in range(1000000):
            dummy = i**2
        return dummy
    return inner()

# without njit:
%timeit outer()
259 ms ± 7.25 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# with njit:
%timeit outer()
119 ns ± 8.2 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
...