python - 使用 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 和并行循环来加快速度的解释或链接。
解决方案
我做了一些测试,似乎嵌套函数解决了这个问题:我将其重写为:
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 位。这就是让它运行得更快的原因,因为在计算之上没有开销。不幸的是,如果没有开销减慢速度,您就无法计算更大的整数。
推荐阅读
- android - 运行时出现错误错误:程序类型已存在:android.support.v4.os.ResultReceiver$MyResultReceiver
- reporting-services - 使用 Microsoft SQL Report Builder 按日期对报告进行排序
- macos - 如何正确使用 hdutils 在(Travis)OSX VM 上创建 DMG
- email - 追踪电子邮件链的历史
- reactjs - 使用 Web api 验证前端
- rest - 将数据从 UI 添加到不同的微服务
- uml - 当一个参与者可以更改另一个参与者的用例时,如何绘制用例图?
- protocol-buffers - 使用protobuf注释时如何删除未使用的类型化需求
- android - 如何在通知的单击上显示对话框
- azure - 是否可以为 Azure 指标生成自定义电子邮件报告?