我正在尝试在核心的所有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个任务感兴趣。
干杯!