python-3.x - Numba 正确实施?
问题描述
不确定这里发生了什么,或者我是否正确使用 Numba,但这里的速度并没有达到预期;请让我知道我缺少什么让 numba 以应有的方式工作。
输出显示 runfile('#####) : Numba-> 0.14654635999977472 :Python-> 0.00047117299982346594
从 numpy 导入日志导入 timeit,从 numba 导入 jit exp
@jit(nopython=True) def Func(): n=100 b=[] for i in range(0,n): b.append(log((i/2+52)**2)*exp(.05*10)) return(i) print(timeit.timeit(Func,number=100)) def Func2(): n=100 c=[] for j in range(0,n): c.append(log((j/2+52)**2)*exp(.05*10)) return(j) print(timeit.timeit(Func,number=100))
解决方案
速度差异的两个原因:(1) Numba 必须在运行代码之前对其进行编译。尝试在计时器之外调用一次函数(强制编译),然后进行计时
(2) 你只进行了 100 次迭代,这对计算机来说不算什么。来自操作系统活动的噪音、计时器的粒度等将使如此小的样本的速度差异相形见绌。尝试进行 10,000 次或更多次迭代(在解决编译问题后)
编辑——如果 OP 将他的循环增加到 1mm 迭代(参见下面的评论),那么代码几乎将所有时间都用于调整数组大小,而不是进行任何计算。
嵌入式数学函数(例如 exp 和 log)已经编译,numba 没有什么可以使用的。Numba 编译只能加速尚未编译的计算和循环。正如所写,循环不能被解开或并行执行,因为 append() 创建了一个串行依赖。
如果 OP 想要查看 numba 和普通 python 之间的区别,他应该寻找具有大量手动计算(而不是嵌入式数学函数)的代码示例。计算 mandlebrot 集就是一个例子;numba 将比独立 python 快许多倍地进行这些计算。
推荐阅读
- angular - 渲染器检查的 ag-grid 复选框列
- java - 将布尔值从片段传递到托管活动
- c# - 如何创建包含其他标签助手的自定义标签助手
- javascript - 在 React 容器组件中使用 recompose 分支
- angular - Angular 5将html导出到图像
- java - Spring 缓存和自定义 CacheResolver 的好处/用法
- c# - RazorPay 未使用密钥和密钥获取 PaymentId
- php - Laravel:按类别名称而不是 id 检索表结果
- node.js - 在 DirectLine WebChat 中将数据从机器人发送到客户端 - NodeJS Botframework
- c# - 如何匹配逗号分隔列表并以不同字符结尾