Есть несколько причин, почему вы не должны этого делать:
- Как правило, это такой подход, который, скорее всего, будет быстрее в чистом Python, чем в украшенной нумбой функции.
- Итерация будет проще и, вероятно, быстрее, однако имейте в виду, что объединение кортежей обычно является
O(n)
операцией, даже в numba. Таким образом, общая производительность функции будет O(n**2)
. Это можно улучшить, используя структуру данных, которая поддерживает добавление O(1)
, или структуру данных, которая поддерживает предварительное распределение размера. Или просто не используя «зацикленный» или «рекурсивный» подход.
- Вы пробовали, что произойдет, если вы пропустите декоратор
njit
и передадите кортеж, содержащий 6 элементов? (подсказка: он достигнет предела рекурсии, потому что он никогда не выполнит конечное условие рекурсии).
На момент написания 0.43.1 Numba поддерживает только простые рекурсии, когда тип аргументов между рекурсиями не меняется. В вашем случае тип меняется, вы передаете tuple(int64 x 2)
, но рекурсивный вызов пытается передать tuple(int64 x 3)
, который является другим типом. Странно, но на моем компьютере это StackOverflow
, что похоже на ошибку в numba.
Я бы предложил использовать это (без нумбы, без рекурсии):
def tup(a):
if len(a) < 5:
a += (3, ) * (5 - len(a))
return a
, который также возвращает ожидаемый результат:
>>> tup((1,))
(1, 3, 3, 3, 3)
>>> tup((1, 2))
(1, 2, 3, 3, 3)