python多处理比平常慢 - 计算太微不足了?

时间:2015-08-03 18:44:31

标签: python arrays numpy multiprocessing fits

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

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

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

THX。

这是我放在一起的示例脚本。

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需要几秒钟才能在我的机器上运行。

1 个答案:

答案 0 :(得分:2)

你可以发送批量数据,因为消息传递是代价高昂的部分:

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