[筆記] python3 zip, repeat 與 multiprocess.Pool() 的搭配用法

使用 multiprocess.Pool() 做多參數傳遞的函式

當我想在多核心運算的 function 的傳入參數不只一個的時候,或是傳入參數比較複雜的時候,需要一些 iteration tool 來幫忙

zip 的功用

幫你把兩個 list 的參數一對一對應!
#coding=utf-8 if __name__=='__main__': a = [1,2] b = [3,4] # 這樣寫只能印出物件的記憶體位置 print(zip(a,b)) # <zip object at 0x1026ad148> # 這樣寫才能看到內容 print(list(zip(a,b))) # [(1, 3), (2, 4)] for i,j in zip(a,b): print(i,j) '''output: 1 3 2 4 ''' # 當 a, b 數量一樣的時候 zip 會幫你一對一對起來

repeat 的功用

協助把一個有多個數值的 list 與單一參數做多對一對應!
自動把單一個參數 “repeat” 多次,以至與 list 得數量相同
#coding=utf-8 from itertools import repeat if __name__=='__main__': # 但是當 a, b 數量不同的時候怎麼辦呢? # 例如 a 是個 list, b 只是一個數字 a = [1,2,3] b = 4 # 使用迭代工具 repeat 來自動幫 b 值做 repeat print(list(zip(a,repeat(b)))) # [(1, 4), (2, 4), (3, 4)] # 又或者我們要把 a,b,c 三個參數組合,拿去跟一個從零開始逐步加一成長中的數字一起迭代計算 a = 1 b = 2 c = [3.14,2.7183,0.009] for i,j,k,l in zip(repeat(a),repeat(b),repeat(c),range(3)): print(i,j,k,l) '''output 1 2 [3.14, 2.7183, 0.009] 0 1 2 [3.14, 2.7183, 0.009] 1 1 2 [3.14, 2.7183, 0.009] 2 ''' p = 1 q = 2 m = 3 N = [0.2,0.3,0.4,0.5] # 使用 zip 搭配 repeat 工具可以將所有參數組合好 目前 range(len(N)) 的部分是想要 iteration 的重點項目 print('zip:',list(zip(repeat(p),repeat(q),repeat(m),range(len(N)),repeat(N)))) ''' 印出的 zip 長這樣: zip: [(1, 2, 3, 0, [0.2, 0.3, 0.4, 0.5]), (1, 2, 3, 1, [0.2, 0.3, 0.4, 0.5]), (1, 2, 3, 2, [0.2, 0.3, 0.4, 0.5]), (1, 2, 3, 3, [0.2, 0.3, 0.4, 0.5])] '''

把 zip 與 repeat 搭配使用於 Pool 當中可以做到多參數傳遞

#coding=utf-8 import multiprocessing as mp from itertools import repeat import numpy as np # 我們想要在 multiprocess 中執行以下多參數的 function def count_error(p,q,m,t,N): print('in func:',p,q,m,t,N) return p + N[t] if __name__=='__main__': # 使用 pool pool = mp.Pool() # 使用 starmap 加上 zip 可以支援多參數傳遞,並可以接到 function 的 reutrn 值 res = pool.starmap(count_error, zip(repeat(p),repeat(q),repeat(m),range(len(N)),repeat(N))) ''' 執行 count_error 的過程 in func: 1 2 3 0 [0.2, 0.3, 0.4, 0.5] in func: 1 2 3 1 [0.2, 0.3, 0.4, 0.5] in func: 1 2 3 2 [0.2, 0.3, 0.4, 0.5] in func: 1 2 3 3 [0.2, 0.3, 0.4, 0.5] ''' print('result:',res) # result: [1.2, 1.3, 1.4, 1.5] print('sum = ',sum(res)) # sum = 5.4

留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking