Python多处理:运行时间随着进程数的增加而增加

时间:2015-04-07 03:47:09

标签: python multiprocessing

我正在尝试在核心的所有4个处理器上运行多处理任务。当我只运行我想要运行的四个任务中的一个时,代码每1000次迭代大约需要3秒。但是,如果我将其设置为运行所有4个进程,则速度将每1000次迭代翻两番,达到13秒。我将在下面附上部分代码。我不确定为什么会这样。我试图做自己的调查,但它似乎不是一个内存或CPU问题。如果我在运行一个任务时进行监视,则其中一个处理器在100%处于活动状态,并且只有0.8%的内存正在使用中。当我运行4个任务时,所有4个处理器都是100%处于活动状态,每个处理器使用的内存为.8%。

不确定为什么会这样。我之前多次使用过多处理任务,从未注意到运行时间的增加。无论如何,这是我凌乱的代码:

import numpy as np
import multiprocessing
from astropy.io import fits
import os
import time

def SmoothAllSpectra(ROOT, range_lo, range_hi):
    file_names = os.listdir(ROOT)
    for i in range(len(file_names)):
        file_names[i] = ROOT + file_names[i]

    pool = multiprocessing.Pool(4)
    for filename in pool.map(work, file_names[range_lo:range_hi]):          
        print filename+' complete'
    return ROOT

def work(filename):
    data = ImportSpectrum(filename)  ##data is a 2d numpy array
    smooth_data = SmoothSpectrum(data, 6900, h0=1)
    return filename

def SmoothSpectrum(data, max_wl, h0=1):
    wl_data = data[0]
    count_data = data[1]
    hi_idx = np.argmin(np.abs(wl_data - max_wl))
    smoothed = np.empty((2, len(wl_data[:hi_idx])))
    smoothed[0] = wl_data[:hi_idx]

    temp = np.exp(-.5 * np.power(smoothed[0,int(len(smoothed[0])/2.)] - smoothed[0], 2) / h0**2)
    idx = np.where(temp>1e-10)[0]
    window = np.ceil(len(idx)/2.)
    numer = np.zeros(len(smoothed[0]))
    denom = np.zeros(len(smoothed[0]))

    for i in range(len(numer)):
        K1 = np.zeros(len(numer))
        if (i-window >= 0) and (i+window <= len(smoothed[0])):
            K1[i-window:i+window] = np.exp(-.5 * np.power(smoothed[0,i] - smoothed[0,i-window:i+window], 2) / h0**2)

        elif i-window < 0:
            K1[:i+window] = np.exp(-.5 * np.power(smoothed[0,i] - smoothed[0,:i+window], 2) / h0**2)
        else:
            K1[i-window:] = np.exp(-.5 * np.power(smoothed[0,i] - smoothed[0,i-window:], 2) / h0**2)

        numer += count_data[i] * K1
        denom += K1

    smoothed[1] = numer / denom
    return smoothed

代码中没有任何花哨的东西,只是平滑了一些数据。我确信有很多方法可以优化此代码,但我对我为什么看到计算时间从1个任务增加到4个任务感兴趣。

干杯!

0 个答案:

没有答案