python - 如何加快 numpy tensor*tensor 运算
问题描述
我的代码中有一个瓶颈,它是 numpy 3d 数组乘以* operator
numpy 3d 数组。
我想用 numba @njit 或 @jit 装饰器加速程序的这一部分,但它降低了 2 倍的性能。
慢的部分代码:
@numba.jit
def mat_mul_and_sum(img1, img2, alpha):
return img1*(1-alpha) + img2*alpha
img1、img2 和 alpha 是具有相同形状的 3d np.array。
是否可以加快这行代码的速度?
解决方案
一种选择实际上是使用numba
它应该使用的方式(不仅仅是应用装饰器)。但是,对于您的特定功能,您可以使用numexpr
包来使用多核渲染。
import numexpr as ne
def mat_mul_and_sum_numexpr(a, b, alpha):
return ne.evaluate('a*(1-alpha) + b*alpha')
使用来自另一个答案的时间:
In [11]: %timeit mat_mul_and_sum(img1, img2, alpha)
21.6 ms ± 955 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [12]: %timeit mat_mul_and_sum2(img1, img2, alpha)
6.35 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [13]: %timeit mat_mul_and_sum_numexpr(img1, img2, alpha)
4.22 ms ± 54.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [14]: np.allclose(mat_mul_and_sum(img1, img2, alpha), mat_mul_and_sum_numexpr(img1, img2, alpha))
Out[14]: True
numba
您可能能够通过s 并行化挤出一些额外的性能,但通常使用numexpr
可以提供很好的性能提升,而无需重新编写任何代码。
推荐阅读
- .htaccess - .htaccess 中的 301 重定向将旧文件路径/名称附加到新 url
- sql - SQL 重叠查询
- python - 如何使用 Pandas 计算两个数据帧之间的百分比差异?
- python - 使用 pandas 将数据添加到 Dataframe
- angular - angular primeng 冻结标题行,上面有标题行
- google-signin - Google 登录 - 检测是否已登录并提示用户
- javascript - Flot JS 将目标变成菱形
- c++ - 如何使用可变模板参数进行模板函数调用?
- jenkins - 完成后如何从 Jenkins 构建中获取构建详细信息的 json 响应
- react-native - Expo 不从 VS Code 调试器热重载