3

問題の解決策を求めてウェブを探しましたが、実際に役立つものは見つかりませんでした。私の問題は、マルチプロセッシングを実装してプログラムを高速化したいということです。関数getSVJJPriceはかなり高速です。ただし、Kのサイズは約 1000 であるため、コード全体がかなり遅くなります。forしたがって、ループを並列化する方法があるのだろうか?コードは以下にあります。

def func2min(x,S,expiry,K,r,prices,curr):
    bid = prices[:,0]
    ask = prices[:,1]

    C_omega = [0]*len(K)
    w = [0]*len(K)

    for ind, k in enumerate(K):
        w[ind] = 1/np.abs(bid[ind] - ask[ind])
        C_omega[ind] = getSVJJPrice(x[0],(x[1] + x[0]**2)/(2*x[2]),
        x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],S[ind],k,r[ind],expiry[ind],
                curr[ind])  

    right = np.sum(w * (np.subtract(C_omega, np.mean(prices,axis=1)))**2)

    print right
    #if right < 10:    
    #    print '\n \n func = ', right 

    if math.isnan(right):
        right = 1e12

    return right

これを調べてくれた人に感謝します!

よろしくお願いします、

ビクター

4

1 に答える 1

2

の各要素をループしているため、コードからの単なる1次元配列のように見えるため、multiprocessing.Poolあなたのケースに適しているようです。KK

基本的に、私の例では、最初にループを実行する関数を作成するparallel_loop必要があります。次に、問題を個別のチャンクに分割する必要があります。この場合、K整数個のピース​​に分割するだけnprocsです。

次にpool.map、各チャンクに対して並列にループを実行するために使用できます。結果はチャンクの順序で収集されますK。何も再配置せず、スライスを実行しただけなので、元の順序と同じです。次に、すべてのピースをwandに戻すだけC_omegaです。

import numpy as np
from multiprocessing import Pool

def parallel_loop(K_chunk):
    C_omega_chunk = np.empty(len(K_chunk)
    w_chunk = np.empty(len(K_chunk))

    for ind, k in enumerate(K_chunk)
        w_chunk[ind] = 1/np.abs(bid[ind] - ask[ind])
        C_omega_chunk[ind] = getSVJJPrice(x[0],(x[1] + x[0]**2)/(2*x[2]),
        x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],S[ind],k,r[ind],expiry[ind],
                curr[ind])  

    return (w_chunk, C_omega_chunk)

def func2min(x,S,expiry,K,r,prices,curr,nprocs):
    bid = prices[:,0]
    ask = prices[:,1]

    K = np.array(K)

    K_chunks = [K[n * len(K) // nprocs : (n + 1) * len(K) // nprocs] for n in range(nprocs)]
    pool = Pool(processes=nprocs)  
    outputs = pool.map(parallel_loop, K_chunks)

    w, C_omega = (np.concatenate(var) for var in zip(*outputs))

    right = np.sum(w * (np.subtract(C_omega, np.mean(prices,axis=1)))**2)

    print right
    #if right < 10:    
    #    print '\n \n func = ', right 

    if math.isnan(right):
        right = 1e12

    return right

サンプル データ セットがないので、上記の例がそのまま機能するかどうかはわかりませんが、それがどのように機能するかについての一般的なアイデアが得られるはずです。

于 2014-10-14T15:15:20.840 に答える