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

似乎multiprocessing.Pool可能适合您的情况,因为您正在遍历 中的每个元素K,并且K看起来它只是代码中的一维数组。

基本上,在我的示例中,您首先必须编写一个执行循环的函数,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 回答