python - Python 中最快的 2D 卷积或图像过滤器

标签 python optimization numpy python-imaging-library scipy

一些用户询问过 numpy 或 scipy 中图像卷积的速度或内存消耗 [1 , 2 , 3 , 4 ]。从回复和我使用 Numpy 的经验来看,我认为这可能是 numpy 与 Matlab 或 IDL 相比的主要缺点。

到目前为止,没有一个答案解决了整个问题,所以这里是:“在 Python 中计算 2D 卷积的最快方法是什么?”常见的 python 模块是公平的游戏:numpy、scipy 和 PIL(其他?)。为了具有挑战性的比较,我想提出以下规则:

  1. 输入矩阵分别为 2048x2048 和 32x32。
  2. 单精度或 double 浮点均可接受。
  3. 不计算将输入矩阵转换为适当格式所花费的时间 - 仅计算卷积步骤。
  4. 用您的输出替换输入矩阵是可以接受的(有任何 python 库支持吗?)
  5. 直接 DLL 调用常见的 C 库是可以的 -- lapack 或 scalapack
  6. PyCUDA 即将推出。使用自定义 GPU 硬件是不公平的。

最佳答案

这真的取决于你想做什么......很多时候,你不需要一个完全通用的(阅读:更慢的)2D卷积......(即如果过滤器是可分离的,你使用两个代替一维卷积...这就是为什么各种 scipy.ndimage.gaussianscipy.ndimage.uniform 比作为通用 n-D 卷积实现的相同事物快得多的原因.)

无论如何,作为一个比较点:

t = timeit.timeit(stmt='ndimage.convolve(x, y, output=x)', number=1,
setup="""
import numpy as np
from scipy import ndimage
x = np.random.random((2048, 2048)).astype(np.float32)
y = np.random.random((32, 32)).astype(np.float32)
""")
print t

这在我的机器上需要 6.9 秒...

将此与 fftconvolve

进行比较
t = timeit.timeit(stmt="signal.fftconvolve(x, y, mode='same')", number=1,
setup="""
import numpy as np
from scipy import signal
x = np.random.random((2048, 2048)).astype(np.float32)
y = np.random.random((32, 32)).astype(np.float32)
""")
print t

这大约需要 10.8 秒。但是,对于不同的输入大小,使用 fft 进行卷积可以相当快(虽然我目前似乎无法提出一个很好的例子......)。

关于python - Python 中最快的 2D 卷积或图像过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5710842/

相关文章:

python - 合并排序索引错误

python - 如何以安全的方式向客户端提供 JSON Web token (JWT)?

python - 操作系统错误: [Errno 13] Permission denied when initializing Celery in Docker

optimization - 检查 TI-Basic 列表中的每个值

java - 在 'try' block 中调用不抛出异常的方法

optimization - 使用线性规划绘制最长路径

python-3.x - 将 numba 与 time.clock() 和 timeit 一起使用

python - Numpy 数组减法

python - Pandas 扩展/滚动窗口相关性计算与 p 值

python - 复制 NumPy 数组的神秘行为