Python:如何将依赖于大型数组的函数中的for循环转换为并行化的for循环

时间:2018-09-05 20:31:18

标签: python arrays windows parallel-processing multiprocess

我正在尝试在Python 3中使用multiprocessWindows中的for循环转换为并行化的for循环。问题是正在处理的阵列需要共享内存,因为如果没有共享内存,我将耗尽内存。如何在此Blubb底部并行化代码?

调用bigExampleArray = multiprocessing.Array(bigExampleArray)会将其转换为共享内存阵列,以进行多处理(据我所知)。我看了很多例子,所有这些例子都依赖于创建函数定义来进行并行工作,但是我不确定如何在我使用许多{{ 1}}方法。喜欢:

multiprocessing

p = multiprocessing.Process(target=parallelForLoopFun, args=(bigExampleArray, bigChangingArray));
p.start();

用上述调用并行工作器函数的方法,或者通过map调用如何轻松地发送多个多维数组,我看不到发送想要的iCntr的方法。

我已经尝试过p = multiprocessing.Pool(4); p.map(parallelForLoopFun, someConstantArray?); 包及其numba(在函数中的def之前应用)和@jit-> range,但无法提高了我更复杂的代码的速度。 (如果您以前没有尝试过numba,请使用prange进行导入)

理想情况下,我希望能够通过简单的调用from numba import jit, prange-> range将for循环转换为并行for循环,但是如果需要一个单独的函数,最好是像这样:

prange

要准备示例数组,此代码应起作用:

def parallelForLoopFun(iCntr,bigExampleArray,bigChangingArray)
    if( bigExampleArray[iCntr,2] > 0.5 ):
        temporaryNumber = np.int32(11+iCntr);
    else:
        temporaryNumber = np.int32(1+iCntr);
    bigChangingArray[iCntr,:] = np.array( [bigExampleArray[iCntr,1],bigExampleArray[iCntr,2]+temporaryNumber] );

下面是我要并行化的功能:

import numpy as np
import time
from test_fun import tediusConverter #I named the function file test_fun

bigExampleArray = np.random.rand(100000000,3);
tic = time.time(); #for time testing
bigReturnedArray = tediusConverter(bigExampleArray);
toc = time.time() - tic; #for time testing
print("\nTime to run: {} sec\n".format(toc)); #extra space at end

上面的代码是通用化的,可以使(我希望)更容易理解并应用于其他事物。以上在我的4C i5-4960k @ 4.5 GHz上运行需要约205秒。最后,请注意,import numpy as np def tediusConverter(bigExampleArray): bigChangingArray = np.zeros( (len(bigExampleArray[:,0]) , 2 ) ); #preallocate for iCntr in range(0, len(bigExampleArray[:,0])): if( bigExampleArray[iCntr,2] > 0.5 ): temporaryNumber = np.int32(11+iCntr); else: temporaryNumber = np.int32(1+iCntr); bigChangingArray[iCntr,:] = np.array( [bigExampleArray[iCntr,1],bigExampleArray[iCntr,2]+temporaryNumber] ); return bigChangingArray; 的{​​{1}}和numba-> @jit(nopython=False,parallel=True)可以使用此简化代码,运行时间约为12秒,使用〜100 %的CPU-因此充满希望! (range的运行时间约为8秒...)

0 个答案:

没有答案