【发布时间】:2015-05-18 11:52:29
【问题描述】:
我试图找出对 2D numpy 数组中的每个单元格并行执行单个操作的最佳方法。
特别是,我需要对数组中的每个单元格进行按位运算。
这就是我使用单个 for 循环所做的:
for x in range(M):
for y in range(N):
v[x][y] = (v[x][y] >> 7) & 255
我找到了一种使用vectorize 方法执行上述相同操作的方法:
def f(x):
return (x >> 7) & 255
f = numpy.vectorize(f)
v = f(v)
但是,使用矢量化似乎并没有提高性能。
我在 this answer on StackOverflow 中读到了 numexpr,其中还引用了 Theano 和 Cython。 Theano 似乎是一个很好的解决方案,但我找不到适合我的例子。
所以我的问题是:使用并行化和可能的 GPU 计算改进上述代码的最佳方法是什么?有人可以发布一些示例代码吗?
【问题讨论】:
-
您可以查看
multiprocessing.Pool,为您的按位运算定义一个函数并发送所有单元格的列表。然后它将使用你所有的处理器来评估结果,但你需要重建数组,这会让你浪费时间。你的阵列有多大?你的计算需要多长时间? -
通过如此简单的元素转换,整体性能可能会受到内存 IO 的限制。即,将数据移入/移出 GPU 可能会使操作总体上变慢。
-
更正第一段代码中的缩进和变量名。
-
@hpaulj,我刚刚完成,谢谢
-
索引二维数组的常规方法是
v[x,y]。在这里使用[x][y]可能是等效的,但是如果v[x]生成的是副本而不是视图,则它不起作用。
标签: python numpy parallel-processing theano