如何實作多執行緒以使此程序更快?該程式生成 100 萬個亂數并將它們寫入檔案。它只需要 2 秒多一點,但我想知道多執行緒是否會使其更快。
import random
import time
startTime = time.time()
data = open("file2.txt", "a ")
for i in range(1000000):
number = str(random.randint(1, 9999))
data.write(number '\n')
data.close()
executionTime = (time.time() - startTime)
print('Execution time in seconds: ', str(executionTime))
uj5u.com熱心網友回復:
簡短的回答:不容易。
以下是使用多處理池加速代碼的示例:
import random
import time
from multiprocessing import Pool
startTime = time.time()
def f(_):
number = str(random.randint(1, 9999))
data.write(number '\n')
data = open("file2.txt", "a ")
with Pool() as p:
p.map(f, range(1000000))
data.close()
executionTime = (time.time() - startTime)
print(f'Execution time in seconds: {executionTime})')
看起來挺好的?等待!這不是直接替換,因為它缺乏行程的同步,因此不會寫入所有 1000000 行(有些會在同一個緩沖區中被覆寫)!請參閱Python 多處理安全地寫入檔案
因此,我們需要將計算數字(并行)與寫入(串行)分開。我們可以這樣做:
import random
import time
from multiprocessing import Pool
startTime = time.time()
def f(_):
return str(random.randint(1, 9999))
with Pool() as p:
output = p.map(f, range(1000000))
with open("file2.txt", "a ") as data:
data.write('\n'.join(output) '\n')
executionTime = (time.time() - startTime)
print(f'Execution time in seconds: {executionTime})')
修復后,請注意這不是多執行緒,而是使用多個行程。您可以使用不同的池物件將其更改為多執行緒:
from multiprocessing.pool import ThreadPool as Pool
在我的系統上,處理池從 1 秒到 0.35 秒。然而,使用 ThreadPool 最多需要 2 秒!
原因是 Python 的全域解釋器鎖阻止了多個執行緒有效地處理您的任務,請參閱什么是 CPython 中的全域解釋器鎖 (GIL)?
總而言之,多執行緒并不總是正確的答案:
- 在您的場景中,一個限制是檔案訪問,只有一個執行緒可以寫入檔案,或者您需要引入鎖定,從而使任何性能提升都變得毫無意義
- 同樣在 Python 中,多執行緒僅適用于特定任務,例如在 python 下的庫中發生的長時間計算,因此可以并行運行。在您的場景中,多執行緒的開銷抵消了性能優勢的微小潛力。
好處:是的,使用多處理而不是多執行緒,我的系統速度提高了 3 倍。
uj5u.com熱心網友回復:
將字串@一次寫入檔案,而不是單獨將每個數字寫入檔案&我已經對其進行了測驗,multithreading并且它實際上會降低性能,因為如果你正在寫入同一個檔案,如果你執行執行緒,你還必須同步這將影響性能。
代碼:(以秒為單位的執行時間:1.943817138671875)
import time
startTime = time.time()
import random
size = 1000_000
# pre declaring the list to save time from resize it later
l = [None] * size
# l = list(str(random.randint(1, 99999)) for i in range(size))
# random.randrange(0, )
for i in range(size):
# l[i] = str(random.randint(1, 99999)) "\n"
l[i] = f"{random.randint(1, 99999)}\n"
# writing data @ once to the file
with open('file2.txt', 'w ') as data:
data.write(''.join(l))
executionTime = (time.time() - startTime)
print('Execution time in seconds: ' str(executionTime))
輸出:
Execution time in seconds: 1.943817138671875
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424573.html
