首页 > 解决方案 > 使用 numba @jit 加速我使用队列的多处理循环

问题描述

我正在学习 Numba 的方法,但还没有弄清楚如何使用或是否需要使用 multiprocessing.queue 来组合来自不同进程的所有循环数据。我什至想使用多处理模块将大循环分解为多个较小的循环以在单独的进程中运行还是 Numba 自动执行此操作?

下面的代码在 multiprocessing 模块中运行,它在多个进程中打开,这些进程被划分为您的系统核心数。因此,有许多代码运行实例,计算循环遍历整个计算的不同部分,然后将结果 0 或 1 发送回父函数。我的猜测是 Numba 自己做这件事的方式不同,我不想使用队列或多处理模块?

@jit(nopython=True)
def prime_multiprocess(n, c, q):
    a, b, c = n[0], n[1], c
    for i in range(a, b):
        if c % i == 0:
            return q.put(0)
    return q.put(1)

This error may have been caused by the following argument(s):
- argument 2: cannot determine Numba type of <class 'multiprocessing.queues.Queue'>

我很欣赏任何解释使用 numba 和并行循环来加快速度的解释或链接。

标签: pythonmultiprocessingnumba

解决方案


我做了一些测试,似乎嵌套函数解决了这个问题:我将其重写为:

def prime_multiprocess(n, c, q):
    a, b, c = n[0], n[1], c

    @jit(nopython=True)
    def speed_comp():
        for i in range(a, b):
            if c % i == 0:
                return 0
        return 1
    q.put(speed_comp())

它更快!

编辑:似乎有一个缺点是我受限于我可以使用的整数的大小。“叹息”“为什么总是要权衡取舍:(”我想知道它是否可以用 numpy 解决这个问题,以及它是否会减慢它的速度。答案可能在这里:Numba 支持大整数?

Numba 的工作方式是将整数转换为机器级别的整数,这些整数的范围仅限于您的系统级别,例如 64 位。这就是让它运行得更快的原因,因为在计算之上没有开销。不幸的是,如果没有开销减慢速度,您就无法计算更大的整数。


推荐阅读