Я начинаю с numba
, и моя первая цель - попытаться ускорить не столь сложную функцию с помощью вложенного цикла.
Имеется следующий класс:
class TestA:
def __init__(self, a, b):
self.a = a
self.b = b
def get_mult(self):
return self.a * self.b
и numpy ndarray
, который содержит объекты класса TestA
.Размер (N,)
, где N
обычно ~ 3 миллиона в длину.
Теперь, учитывая следующую функцию:
def test_no_jit(custom_class_obj_container):
container_length = len(custom_class_obj_container)
sum = 0
for i in range(container_length):
for j in range(i + 1, container_length):
obj_i = custom_class_obj_container[i]
obj_j = custom_class_obj_container[j]
sum += (obj_i.get_mult() + obj_j.get_mult())
return sum
Я попытался поиграть numba
, чтобы заставить его работать с вышеуказанной функцией, однако я не могу заставить ее работать сnopython=True
флаг, и если он установлен в false, то время выполнения выше, чем у функции no-jit.
Вот моя последняя попытка jit
функции (также использующая nb.prange):
@nb.jit(nopython=False, parallel=True)
def test_jit(custom_class_obj_container):
container_length = len(custom_class_obj_container)
sum = 0
for i in nb.prange(container_length):
for j in nb.prange(i + 1, container_length):
obj_i = custom_class_obj_container[i]
obj_j = custom_class_obj_container[j]
sum += (obj_i.get_mult() + obj_j.get_mult())
return sum
Я пытался искать, но не могу найтиучебник о том, как определить пользовательский класс в сигнатуре, и как мне поступить, чтобы ускорить функцию такого рода и заставить ее работать на GPU и, возможно, (любая информация по этому вопросу будет высоко цениться), чтобы получить ееработать с cuda
библиотеками - которые установлены и готовы к использованию (ранее использовались с tensorflow
)