我正在尝试在Python 3中使用multiprocess
将Windows
中的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秒...)