溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用多線程加速Python代碼

發(fā)布時(shí)間:2021-09-13 18:21:06 來(lái)源:億速云 閱讀:245 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹如何使用多線程加速Python代碼,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

很多時(shí)候,我們大部分使用Python編寫代碼,python因?yàn)槠浜?jiǎn)潔,在一些小功能的開發(fā)確實(shí)快一些,當(dāng)我們的代碼執(zhí)行遠(yuǎn)程請(qǐng)求或讀取多個(gè)文件或?qū)δ承?shù)據(jù)進(jìn)行處理。在很多情況下下,我們大家都是利用循環(huán)去讀取,這種方法要花很長(zhǎng)時(shí)間才能完成執(zhí)行。

import requests
from time import time

url_list = [
   "https://via.placeholder.com/400",
   "https://via.placeholder.com/410",
   "https://via.placeholder.com/420",
   "https://via.placeholder.com/430",
   "https://via.placeholder.com/440",
   "https://via.placeholder.com/450",
   "https://via.placeholder.com/460",
   "https://via.placeholder.com/470",
   "https://via.placeholder.com/480",
   "https://via.placeholder.com/490",
   "https://via.placeholder.com/500",
   "https://via.placeholder.com/510",
   "https://via.placeholder.com/520",
   "https://via.placeholder.com/530",
]

def download_file(url):
   html = requests.get(url, stream=True)
   return html.status_code

start = time()

for url in url_list:
   print(download_file(url))

print(f'Time taken: {time() - start}')

輸出:

Time taken: 4.128157138824463

        這是很明顯的案例,這段代碼將依次打開每個(gè)URL,等待其加載,打印其狀態(tài)代碼,然后再移至下一個(gè)URL。如果用上面的寫法將十分耗時(shí),這種代碼非常適合用于多線程。

        利用多線程,您可以以非常低的開銷同時(shí)執(zhí)行多個(gè)任務(wù)。接下來(lái)我們?nèi)ピ囈幌隆?/p>

        我們使用 current.futures 庫(kù)的ThreadPoolExecutor實(shí)現(xiàn)多線程。然后我們寫一下多線程代碼,并解釋原理。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from time import time

url_list = [
   "https://via.placeholder.com/400",
   "https://via.placeholder.com/410",
   "https://via.placeholder.com/420",
   "https://via.placeholder.com/430",
   "https://via.placeholder.com/440",
   "https://via.placeholder.com/450",
   "https://via.placeholder.com/460",
   "https://via.placeholder.com/470",
   "https://via.placeholder.com/480",
   "https://via.placeholder.com/490",
   "https://via.placeholder.com/500",
   "https://via.placeholder.com/510",
   "https://via.placeholder.com/520",
   "https://via.placeholder.com/530",
]

def download_file(url):
   html = requests.get(url, stream=True)
   return html.status_code

start = time()

processes = []
with ThreadPoolExecutor(max_workers=10) as executor:
   for url in url_list:
       processes.append(executor.submit(download_file, url))

for task in as_completed(processes):
   print(task.result())


print(f'Time taken: {time() - start}')

輸出:

Time taken: 0.4583399295806885

        代碼處理速度增加了9倍!如果有更多的URL,則性能差異應(yīng)該更明顯。

        為什么多線程速度那么快。當(dāng)我們?cè)谡{(diào)用executor.submit時(shí),我們往線程池添加一個(gè)新的任務(wù)。

        那到底是怎么回事?調(diào)用時(shí),executor.submit我們正在向線程池添加新任務(wù)。連接其存儲(chǔ)起來(lái),之后我們將便利調(diào)用任務(wù),并打印結(jié)果。

as_completed方法是用來(lái)在一個(gè)任務(wù)完成后,立即從任務(wù)列表拿出一個(gè)任務(wù)去執(zhí)行。只有已經(jīng)執(zhí)行完成或者被取消,任務(wù)才會(huì)標(biāo)記為完成狀態(tài)。我們也可以向其傳遞一個(gè)超時(shí)參數(shù),如果任務(wù)花費(fèi)的時(shí)間超過(guò)該時(shí)間段,則即使也會(huì)as_completed切換任務(wù)。

以上是“如何使用多線程加速Python代碼”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI