【发布时间】:2018-05-22 12:22:01
【问题描述】:
我从numba 开始,我的第一个目标是尝试使用嵌套循环加速一个不那么复杂的函数。
给定以下类:
class TestA:
def __init__(self, a, b):
self.a = a
self.b = b
def get_mult(self):
return self.a * self.b
还有一个包含TestA 类对象的numpy ndarray。维度(N,) 其中N 通常长度约为300 万。
现在给出以下函数:
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 一起使用)
【问题讨论】:
-
如果这能起作用,我感到很惊讶。 Numba 依赖于具有底层 ctype 映射并且不能扩展到任意对象 dtype AFAIK。
-
Numba 仅针对 atomic 类型和 numpy 类型编译为 C(因为它们已经在 C 中)。它无法使用
nopython处理自定义对象,因为它没有将对象映射到 C 的方法。
标签: python python-3.x numpy numba