Как эффективно создать кортеж длиной N с кодом, который будет компилироваться с помощью numba? - PullRequest
0 голосов
/ 11 июля 2020

Я рассчитал два способа создания кортежа длиной N.

Это очень быстро:

def createTuple():
    for _ in range(100000):
        tuplex = (0,) * 1000


CPU times: user 439 ms, sys: 1.01 ms, total: 440 ms
Wall time: 442 ms

Это очень быстро, но не компилируется с Numba:

Invalid use of Function(<built-in function mul>) with argument(s) of type(s): (UniTuple(Literal[int](0) x 1), int64)

Это намного медленнее:

def createTuple():
    for _ in range(100000):
        tuplex = tuple(0 for _ in range(1000))

%time createTuple()


CPU times: user 5.28 s, sys: 3.28 ms, total: 5.29 s
Wall time: 5.29 s

А также не удается скомпилировать:

The use of yield in a closure is unsupported.

Я новичок в Python и Numba. Есть ли способ получить кортеж длиной N (известный во время компиляции), создаваемый - надеюсь, эффективно - с помощью Numba?

1 Ответ

0 голосов
/ 12 июля 2020

Из документации numba (0.50) :

Примечание

Сам конструктор tuple() НЕ поддерживается.

Итак, в коде numba кортежи должны быть либо предоставлены как аргументы функции, либо инициализированы как литералы, например (0, 1, 2, 3). Это прискорбно, потому что это означает, что для операций с фигурами массивов требуются кортежи в numba, хотя они отлично работают с массивами int в обычных numpy:

shape = np.arange(1, 4)
np.zeros(shape) # OK for normal python code, not in an @njit function.

Вам придется реорганизовать свой код, чтобы создание кортежа вне функции @njit:

@njit
def foo(tup):
   ...

foo(tuple(np.zeros(100)))

К сожалению, tuple(np.zeros(100)) относительно медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...