初學者看過來:Python中多執行緒和多處理的指南
使用Python分析資料,如果使用了正確的資料結構和演算法,有時可以大量提高程式的速度。實現此目的的一種方法是使用Muiltithreading(多執行緒)或Multiprocessing(多重處理)。 |
使用Python分析資料,如果使用了正確的資料結構和演算法,有時可以大量提高程式的速度。實現此目的的一種方法是使用Muiltithreading(多執行緒)或Multiprocessing(多重處理)。
在這篇文章中,我們不會詳細討論多執行緒或多處理的內部原理。相反,我們舉一個例子,編寫一個小的Python 從Unsplash下載影像。我們將從一次下載一個影像的版本開始。接下來,我們使用執行緒來提高執行速度。
Python中多執行緒和多處理的初學者指南
多執行緒
簡單地說,執行緒允許您並行地執行程式。花費大量時間等待外部事件的任務通常適合執行緒化。它們也稱為I/O Bound任務例如從檔案中讀寫,網路操作或使用API線上下載。讓我們來看一個示例,它展示了使用執行緒的好處。
1. 沒有執行緒
在本例中,我們希望透過順序執行程式來檢視從Unsplash API下載15張影像需要多長時間:
import requests import time img_urls = [ 'https://images.unsplash.com/photo-1516117172878-fd2c41f4a759', 'https://images.unsplash.com/photo-1532009324734-20a7a5813719', 'https://images.unsplash.com/photo-1524429656589-6633a470097c', 'https://images.unsplash.com/photo-1530224264768-7ff8c1789d79', 'https://images.unsplash.com/photo-1564135624576-c5c88640f235', 'https://images.unsplash.com/photo-1541698444083-023c97d3f4b6', 'https://images.unsplash.com/photo-1522364723953-452d3431c267', 'https://images.unsplash.com/photo-1513938709626-033611b8cc03', 'https://images.unsplash.com/photo-1507143550189-fed454f93097', 'https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e', 'https://images.unsplash.com/photo-1504198453319-5ce911bafcde', 'https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99', 'https://images.unsplash.com/photo-1516972810927-80185027ca84', 'https://images.unsplash.com/photo-1550439062-609e1531270e', 'https://images.unsplash.com/photo-1549692520-acc6669e2f0c' ] start = time.perf_counter() #start timer for img_url in img_urls: img_name = img_url.split('/')[3] #get image name from url img_bytes = requests.get(img_url).content with open(img_name, 'wb') as img_file: img_file.write(img_bytes) #save image to disk finish = time.perf_counter() #end timer print(f"Finished in {round(finish-start,2)} seconds") #results Finished in 23.101926751 seconds
一共用時23秒。
2. 多執行緒
讓我們看看Pyhton中的執行緒模組如何顯著地改進我們的程式執行:
import time from concurrent.futures import ThreadPoolExecutor def download_images(url): img_name = img_url.split('/')[3] img_bytes = requests.get(img_url).content with open(img_name, 'wb') as img_file: img_file.write(img_bytes) print(f"{img_name} was downloaded") start = time.perf_counter() #start timer with ThreadPoolExecutor() as executor: results = executor.map(download_images,img_urls) #this is Similar to map(func, *iterables) finish = time.perf_counter() #end timer print(f"Finished in {round(finish-start,2)} seconds") #results Finished in 5.544147536 seconds
我們可以看到,與不使用執行緒程式碼相比,使用執行緒程式碼可以顯著提高速度。從23秒到5秒。
對於本例,請注意在建立執行緒時存在開銷,因此將執行緒用於多個API呼叫是有意義的,而不僅僅是單個呼叫。
此外,對於密集的計算,如資料處理,影像處理多處理比執行緒執行得更好。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2692251/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Java多執行緒初學者指南(1):執行緒簡介Java執行緒
- 【原創】Java多執行緒初學者指南(4):執行緒的生命週期Java執行緒
- 【原創】Java多執行緒初學者指南(3):使用Runnable介面建立執行緒Java執行緒
- 【原創】Java多執行緒初學者指南(5):join方法的使用Java執行緒
- 【原創】Java多執行緒初學者指南(2):用Thread類建立執行緒Java執行緒thread
- Python自由之路(三)多執行緒處理Python執行緒
- Python中的多工:多執行緒Python執行緒
- Python的多程式和多執行緒Python執行緒
- java中多執行緒併發的處理方式Java執行緒
- 【原創】Java多執行緒初學者指南(12):使用Synchronized塊同步變數Java執行緒synchronized變數
- 多工處理方式之二:多執行緒執行緒
- threading 多執行緒控制和處理thread執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 多執行緒和多執行緒同步執行緒
- 【原創】Java多執行緒初學者指南(6):慎重使用volatile關鍵字Java執行緒
- 搞定python多執行緒和多程式Python執行緒
- boost中asio網路庫多執行緒併發處理實現,以及asio在多執行緒模型中執行緒的排程情況和執行緒安全。執行緒模型
- java 基礎之圖片的多執行緒處理和大檔案的多執行緒拷貝Java執行緒
- Python模組學習:thread 多執行緒處理Pythonthread執行緒
- Spring Batch中透過多執行緒和非同步處理提高效能SpringBAT執行緒非同步
- Python模組學習:threading 多執行緒控制和處理Pythonthread執行緒
- 理解 python 中多執行緒Python執行緒
- Android 中 EventBus 的使用(3):多執行緒事件處理Android執行緒事件
- Python 多執行緒和鎖Python執行緒
- python 多程式和多執行緒學習Python執行緒
- 大郎!快起來看多執行緒啦!執行緒
- 前端多執行緒處理——async/await前端執行緒AI
- Spring多執行緒事務處理Spring執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- Python 多執行緒多程式Python執行緒
- 多執行緒理論執行緒
- Java 多執行緒處理任務的封裝Java執行緒封裝
- python多執行緒Python執行緒
- Python 多執行緒Python執行緒
- 是兄弟!就來看這篇多執行緒!叄執行緒
- 多執行緒-程式和執行緒的概述執行緒
- 【Python】 多程式與多執行緒Python執行緒
- 3種方式實現python多執行緒併發處理Python執行緒