Python 是一種流行的編程語言,也是數據科學社區中最受歡迎的語言。與其他流行編程語言相比,Python
的主要缺點是它的動態特性和多功能屬性拖慢了速度表現。Python
代碼是在運行時被解釋的,而不是在編譯時被編譯為原生代碼。
1、Python 多線程處理的基本指南
C 語言的執行速度比 Python
代碼快 10
到 100
倍。但如果對比開發速度的話,Python
比 C 語言要快。對于數據科學研究來說,開發速度遠比運行時性能更重要。由于存在大量 API
、框架和包,Python
更受數據科學家和數據分析師的青睞,只是它在性能優化方面落后太多了。
2、多處理入門
考慮一個單核心 CPU
,如果它被同時分配多個任務,就必須不斷地中斷當前執行的任務并切換到下一個任務才能保持所有進程正常運行。對于多核處理器來說,CPU
可以在不同內核中同時執行多個任務,這一概念被稱為并行處理。
3、它為什么如此重要?
數據整理、特征工程和數據探索都是數據科學模型開發管道中的重要元素。在輸入機器學習模型之前,原始數據需要做工程處理。對于較小的數據集來說,執行過程只需幾秒鐘就能完成;但對于較大的數據集而言,這項任務就比較繁重了。
并行處理是提高 Python
程序性能的一種有效方法。Python
有一個多處理模塊,讓我們能夠跨 CPU
的不同內核并行執行程序。
4、實現
我們將使用來自 multiprocessing
模塊的 Pool
類,針對多個輸入值并行執行一個函數。這個概念稱為數據并行性,它是 Pool
類的主要目標。
我將使用從
Kaggle
下載的Quora
問題對相似性數據 集來演示這個模塊。
上述數據集包含了很多在 Quora
平臺上提出的文本問題。我將在一個 Python
函數上執行多處理模塊,這個函數通過刪除停用詞、刪除 HTML 標簽、刪除標點符號、詞干提取等過程來處理文本數據。
preprocess()
就是執行上述文本處理步驟的函數。
可以在 這里 找到托管在我的 GitHub
上的函數 preprocess()
的代碼片段。
現在,我們使用 multiprocessing
模塊中的 Pool
類為數據集的不同塊并行執行該函數。數據集的每個塊都將并行處理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import multiprocessing from functools import partial from QuoraTextPreprocessing import preprocess BUCKET_SIZE = 50000 def run_process(df, start): df = df[start:start + BUCKET_SIZE] print (start, "to " ,start + BUCKET_SIZE) temp = df[ "question" ]. apply (preprocess) chunks = [x for x in range ( 0 ,df.shape[ 0 ], BUCKET_SIZE)] pool = multiprocessing.Pool() func = partial(run_process, df) temp = pool. map (func,chunks) pool.close() pool.join() |
該數據集有 537,361
條記錄(文本問題)需要處理。對于 50,000
的桶大小,數據集被分成 11 個較小的數據塊,這些塊可以并行處理以加快程序的執行時間。
5、基準測試
人們常問的問題是使用多處理模塊后執行速度能快多少。我在實現了數據并行性,對整個數據集執行一次 preprocess()
函數后對比了基準執行時間。
運行測試的機器有 64GB 內存和 10 個 CPU 內核。
多處理和單處理執行的基準時間:
從上圖中,我們可以觀察到 Python
函數的并行處理將執行速度提高了近 30
倍。
我們可以在我的
GitHub
中找到用于記錄基準測試數據的Python
文件。
基準測試過程:
結 論:
在本文中,我們討論了 Python
中多處理模塊的實現,該模塊可用于加速 Python
函數的執行。添加幾行多處理代碼后,具有 537k 實例的數據集的執行時間幾乎快了 30 倍。
處理大型數據集的時候,我建議大家使用并行處理,因為它可以節省大量時間并加快工作流程。
到此這篇關于幾行代碼讓 Python 函數執行快 30 倍的文章就介紹到這了,更多相關Python
函數執行內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://zhuanlan.zhihu.com/p/408371071