python多程序逐對比較文件相似度 均分比較次數

2021-08-20 13:00:45 字數 2939 閱讀 1407

最近用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呢?這是因為...