使用numba @jit加快使用队列的多处理循环

时间:2019-08-15 20:41:43

标签: python multiprocessing numba

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

下面的代码在多处理模块中运行,在多处理模块中,该代码在多个进程中打开,这些进程划分为系统核心数量。因此,有很多代码实例在整个计算的不同部分运行并进行计算循环,然后将结果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和并行循环来加快速度的解释或链接。

1 个答案:

答案 0 :(得分:0)

我做了一些测试,看来嵌套函数可以解决问题: 我将其重写为:

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 support for big integers?

Numba的工作方式是将整数转换为机器级别的整数,这些级别的范围仅限于系统级别(例如64位)。这是它使运行速度更快的原因,因为没有额外的计算开销。不幸的是,如果没有开销使事情变慢,就无法计算更大的整数。