2013-10-15 7 views
2

Я не запускаю свой код для запуска, и, как и другие, у меня проблемы с пониманием того, как работает многопроцессорная обработка. Вот мой код до сих порPython многопроцессорность суммы

if __name__ == "__main__": 
    start = time.clock() 
    bins = np.linspace(0,5 * 2 ** 15, 2 ** 15, endpoint=False) # 1e3 
    t_full = np.linspace(0, 0.2, 2 * bins.shape[0], endpoint=False) 
    po = Pool() 
    res = po.map_async(timeseries, ((m, n, params, bins, 1, t_full, i, i + 1) for i in xrange(2 ** 15))) 
    signal = sum(res.get()) 

где таймсерия дается

def timeseries_para(m, n, params, bins, seed, t, sum_min, sum_max): 
    np.random.seed(seed) 

    PSD_data = PSD(m, n, params, bins) 
    dataReal = np.empty_like(PSD_data) 

    for i in range(bins.shape[0]): 
     dataReal[i] = np.random.normal(PSD_data[i], 0.1 * PSD_data[i]) 

    plt.loglog(bins, dataReal, 'red') 

    dataCOS = np.sqrt(dataReal) 
    signal = np.zeros(t.shape[0]) 

    ## Calculating timeseries 
    #for i in range(bins.shape[0]): 
    for i in range(sum_min, sum_max): 
     #start = time.clock() 
     signal += dataCOS[i] * np.cos(2 * np.pi * t * bins[i] + random.uniform(0, 2 * np.pi)) 
     #print time.clock() - start   

    return signal 

Моя сумма идет от 0 до 2 ** 16, поэтому превышение скорости это вверх имеет важное значение. Моя проблема в том, что я сначала не знаю, как правильно назвать мою функцию и как я могу суммировать все свои ответы.

Спасибо за любой совет!

+0

Что именно это вопрос? Не многопроцессорность, обеспечивающая прибыль, которую вы ищете? Или что именно не работает? –

+0

Возможно, проблема связана с синтаксисом 'po.map_async', который не поддерживает несколько итераций. Таким образом, он кормит один кортеж args вашей функции, но ваша функция ожидает отдельных аргументов. Измените определение функции, чтобы принять один кортеж: 'def timeseries_para ((m, n, params, bins, seed, t, sum_min, sum_max))' – askewchan

ответ

1

Это решение работает и я использую векторизованную решение proposed here для того, чтобы избежать Python петли:

from multiprocessing import Pool 

import numpy as np 

def calc(t_full, w, dataCOS): 
    thetas = np.multiply.outer((2*np.pi*t_full), w) 
    thetas += 2*np.pi*np.random.random(thetas.shape) 

    signal = np.cos(thetas) 
    signal *= dataCOS 

    signal = signal.sum(-1) 

    return signal 

def parallel_calc(w, dataCOS, t_full, processes, num): 
    '''Parallel calculation 

    processes : integer 
     Number of processes, usually one processor for each process 
    num : integer 
     Number of sub-divisions for `w` and `dataCOS` 
     Must be an exact divisor of `len(w)` and `len(dataCOS)` 
    ''' 
    pool = Pool(processes=processes) 
    # 
    results = [] 
    wd = np.vstack((w, dataCOS)) 
    for wd_s in np.split(wd.T, num): 
     w_s = wd_s.T[0] 
     d_s = wd_s.T[1] 
     results.append(pool.apply_async(calc, (t_full, w_s, d_s))) 
    # 
    pool.close() 
    pool.join() 
    return sum((r.get() for r in results)) 

if __name__ == '__main__': 
    w = np.random.random(1000) 
    dataCOS = np.random.random(1000) 
    t_full = np.arange(2**16) 
    # 
    parallel_calc(w, dataCOS, t_full, 4, 10) 
+1

выглядит хорошо, я дам ему попробовать завтра – user2003965

0

Хорошо, я могу скомпилировать любой hellOkay, я могу скомпилировать его любой ад да, свой путь быстрее , К сожалению, это дает другой результат.

Если я даю PSD, рассчитать таймсерии и сделать FFT обратно в PSD, я получаю что-то другое.

pot = 13 

bins = np.linspace(0,5 * 2**pot,2**pot, endpoint = False) 
t_full = np.linspace(0,0.2,2*bins.shape[0], endpoint = False) 

PSD = 1000/(1000**2 + bins**2) 

plt.loglog(bins, PSD) 

signal = parallel_calc(bins, PSD, t_full, 6, 1024) 

start = time.clock() 
n = signal.size 
timestep = t_full[1] - t_full[0] 

freq = np.fft.fftfreq(n, d=timestep) 
freq = freq[:freq.size/2] 

PSD_from_timeserie = abs(scipy.fftpack.fft(signal)/ n * 2)**2 
PSD_from_timeserie = PSD_from_timeserie[:PSD_from_timeserie.size/2] 

plt.loglog(freq, PSD_from_timeserie, 'x') 

#plt.plot(result) 
plt.show() 

Это то, что я получаю: enter image description here и как это должно выглядеть enter image description here (Different PSD, конечно)

Смежные вопросы