您好,登錄后才能下訂單哦!
這篇文章主要介紹如何使用多線程加速Python代碼,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
很多時候,我們大部分使用Python編寫代碼,python因為其簡潔,在一些小功能的開發確實快一些,當我們的代碼執行遠程請求或讀取多個文件或對某些數據進行處理。在很多情況下下,我們大家都是利用循環去讀取,這種方法要花很長時間才能完成執行。
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
這是很明顯的案例,這段代碼將依次打開每個URL,等待其加載,打印其狀態代碼,然后再移至下一個URL。如果用上面的寫法將十分耗時,這種代碼非常適合用于多線程。
利用多線程,您可以以非常低的開銷同時執行多個任務。接下來我們去試一下。
我們使用 current.futures 庫的ThreadPoolExecutor實現多線程。然后我們寫一下多線程代碼,并解釋原理。
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,則性能差異應該更明顯。
為什么多線程速度那么快。當我們在調用executor.submit
時,我們往線程池添加一個新的任務。
那到底是怎么回事?調用時,executor.submit我們正在向線程池添加新任務。連接其存儲起來,之后我們將便利調用任務,并打印結果。
as_completed
方法是用來在一個任務完成后,立即從任務列表拿出一個任務去執行。只有已經執行完成或者被取消,任務才會標記為完成狀態。我們也可以向其傳遞一個超時參數,如果任務花費的時間超過該時間段,則即使也會as_completed
切換任務。
以上是“如何使用多線程加速Python代碼”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。