python多重处理比正常慢-计算太微不足道?

标签 python arrays numpy multiprocessing fits

我对 python 并行处理没有太多经验。 我有一个脚本,它接受几个拟合文件(基本上是图像),将它们读入 3D numpy 数组并对其进行一些计算。 我想“最糟糕”的部分是,我有 2 个 for 循环,在数组的二维上迭代。在循环内部,我基本上得到一个列表,其中包含给定 x 和 y 坐标处的 numpy 数组的第三维。然后我计算最大值,以及最大值位于哪个索引处。然后,我将结果写入两个新的具有相同 x 和 y 坐标的二维数组。

对于尺寸约为 6000x6000x20 的拟合文件,这可能需要几分钟才能完成。 然后我尝试并行运行,因为每个 2D 视线都是相互独立的,因此可以在单独的进程中进行计算。

我看了一些调用多处理的基本教程,但每次我尝试它,都需要 10 倍的时间...... 我在这里读过一些问题,多重处理可能会产生很大的开销。是否有可能开销所需的处理时间比过程中实际计算的时间要长很多,这就是速度慢很多的原因?

谢谢。

这是我整理的示例脚本。

import numpy,time
import multiprocessing as mp

xs = 500
data = numpy.random.rand(100,xs,xs)
data2 = numpy.zeros(shape=(xs,xs))

def calculation(los):
    maxindex = numpy.argmax(los)
    return maxindex

t0 = time.time()
for x in range(xs):
    for y in range(xs):
        los = data[:,x,y]
        data2[x,y]=calculation(los)
t1 = time.time()
print t1-t0

t0 = time.time()
pool = mp.Pool(processes=4)
results = [pool.apply_async(calculation, args=(data[:,x,y],)) for x in range(xs) for y in range(xs)]
t1 = time.time()

print t1-t0

第一个版本大约需要 1 秒,第二个版本在我的机器上需要 12 秒。

最佳答案

您可以发送批量数据,因为消息传递是成本高昂的部分:

import numpy,time
import multiprocessing as mp

xs = 500
data = numpy.random.rand(100,xs,xs)
data2 = numpy.zeros(shape=(xs,xs))

def calculation(los):
    maxindex = numpy.argmax(los)
    return maxindex

def calculation_batch(los):
    maxindex = []
    for l in los:
        maxindex.append(umpy.argmax(los))
    return maxindex


t0 = time.time()
for x in range(xs):
    for y in range(xs):
        los = data[:,x,y]
        data2[x,y]=calculation(los)
t1 = time.time()
print t1-t0

t0 = time.time()
pool = mp.Pool(processes=4)
results = [pool.apply_async(calculation, args=(data[:,x:x+250,y:y+250],)) for x in [0, 250] for y in [0, 250]]
t1 = time.time()

print t1-t0

这给了我:

0.787902832031
0.846422195435

关于python多重处理比正常慢-计算太微不足道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794539/

相关文章:

python - Eventlet 和 SMTP

python - sklearn min_impurity_decrease 解释

C函数返回指针和动态数组

numpy - 创建二维数组并填充 numpy 中每行的第一列

python - 使用唯一值更改重复项

python - 如何将两个向量相乘并得到一个矩阵?

python - 使用带有 tkinter 输入 GUI 形式的内部函数结束正在运行的函数,并在退出 GUI 时显示警告消息

python - 删除 numpy 数组中第一次出现的元素

arrays - 使用 Numpy genfromtxt 导入数据并使用日期时间格式化列

c - C 中的通用列表包含垃圾值