最近用python做資料處理,363個檔案逐對比較相似度,總共65703次。之前學習神經網路發現cpu使用率只有30%多,應該是只用了一核,這次計算密集型任務,用多程序跑下看看提速效果。先把分析物件拆成多份,讓每份的數量基本均勻,然後多執行緒跑,風扇果然嗡嗡起來了。下面是乙個小樣本量的測試結果,由於每次比對的計算量不同,所以效率不會是線性提公升,我做了乙個計算量相同的測試,效率也不是線性提公升的,不是簡單的多用一核就能提高一倍效率,這個好理解。總cpu使用率相對每個cpu使用率是線性累加的。我的cpu是i7-7500u cpu @ 2.70ghz~2.90g,雙核雙線程四個邏輯核。三個執行緒基本就跑滿了。對於大資料量的場景,多執行緒的威力就發揮得更明顯了。
我有一次跑的過程中報錯了,沒細看,裡面有pandas的內容,直覺是多程序可能不穩定,後面再跑沒遇到過。
執行環境
程序數總cpu使用率
每程序cpu使用率
耗時(s)
ubuntu子系統
137%
3294
ubuntu子系統
265%
3167
ubuntu子系統
396%
3060
ubuntu子系統
4100%
2457
364個檔案逐對比較,總共比較次數為66066
程序起始時間戳
處理條數
耗時(s)
1個程序--
-程序1
1528290177.8083532
66066
19.36804223060608
總66066
19.423198461532593
2個程序--
-程序1
1528290066.5728095
33153
10.518495559692383
程序21528290066.5882878
32913
10.646009922027588
總66066
10.698017120361328
3個程序--
-程序1
1528289094.8444376
22011
9.382812976837158
程序21528289094.8605711
22110
9.47968602180481
程序31528289094.8762245
21945
9.627197742462158
總66066
9.712886095046997
4個程序--
-程序1
1528289148.3423731
16302
9.519663095474243
程序21528289148.3572035
16611
9.670548915863037
程序31528289148.376095
16471
9.6192147731781
程序41528289148.3954604
16682
9.710239171981812
總66066
9.799142360687256
結論:1個程序到2個程序接近線性提公升,3個程序提公升微弱,4個程序反而比3個程序更慢。
if __name__ == '__main__':
start = time.time()
# 程序安全的列表
result = manager().list()
# 下面均分函式的輸出
shred = [(0, 49), (49, 106), (106, 182), (182, 364)]
# 將程序新增進列表
task =
for i in shred:
# 逐個啟動程序,不要把join直接寫在start後面,那樣就成單程序了
for i in task:
i.start()
# 程序全部阻塞以後再列印列表
for i in task:
i.join()
for i in
result:
print(i)
print(time.time() - start)
n個檔案逐對比較總共比較len(list(itertools.combinations(range(100),2)))
次,寫了乙個均分比較次數的函式,比較弱,但還好使。我覺得這可以作為一道面試題。
"""
"""均分比較次數
輸入:file-檔案數量 shred-份數
輸出:列表,元素是分段起止位置組成的元祖
"""def find_div_pos(file, shred):
s = sum(range(file))
point = [s * i / shred for i in range(1, shred + 1)][:-1]
result =
for p in point:
accu = file - 1
# 倒著迭代是為了更快找到切分點
# 每次都從頭開始迭代影響效率,但是可以忽略
for i in range(file - 2, 0, -1):
accu += i
if abs(accu - i - p) > abs(accu - p) < abs(accu + i - 1 - p):
break
return list(zip([0] + result, result + [file]))
re = find_div_pos(364, 4)
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...
python多程序 Python多程序程式設計詳解
本文 在 python 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...