幾行代碼讓 Python 函數(shù)執(zhí)行快 30 倍
Python 是一種流行的編程語(yǔ)言,也是數(shù)據(jù)科學(xué)社區(qū)中最受歡迎的語(yǔ)言。與其他流行編程語(yǔ)言相比,Python
的主要缺點(diǎn)是它的動(dòng)態(tài)特性和多功能屬性拖慢了速度表現(xiàn)。Python
代碼是在運(yùn)行時(shí)被解釋的,而不是在編譯時(shí)被編譯為原生代碼。
1、Python 多線程處理的基本指南
C 語(yǔ)言的執(zhí)行速度比 Python
代碼快 10
到 100
倍。但如果對(duì)比開發(fā)速度的話,Python
比 C 語(yǔ)言要快。對(duì)于數(shù)據(jù)科學(xué)研究來(lái)說(shuō),開發(fā)速度遠(yuǎn)比運(yùn)行時(shí)性能更重要。由于存在大量 API
、框架和包,Python
更受數(shù)據(jù)科學(xué)家和數(shù)據(jù)分析師的青睞,只是它在性能優(yōu)化方面落后太多了。
2、多處理入門
考慮一個(gè)單核心 CPU
,如果它被同時(shí)分配多個(gè)任務(wù),就必須不斷地中斷當(dāng)前執(zhí)行的任務(wù)并切換到下一個(gè)任務(wù)才能保持所有進(jìn)程正常運(yùn)行。對(duì)于多核處理器來(lái)說(shuō),CPU
可以在不同內(nèi)核中同時(shí)執(zhí)行多個(gè)任務(wù),這一概念被稱為并行處理。
3、它為什么如此重要?
數(shù)據(jù)整理、特征工程和數(shù)據(jù)探索都是數(shù)據(jù)科學(xué)模型開發(fā)管道中的重要元素。在輸入機(jī)器學(xué)習(xí)模型之前,原始數(shù)據(jù)需要做工程處理。對(duì)于較小的數(shù)據(jù)集來(lái)說(shuō),執(zhí)行過(guò)程只需幾秒鐘就能完成;但對(duì)于較大的數(shù)據(jù)集而言,這項(xiàng)任務(wù)就比較繁重了。
并行處理是提高 Python
程序性能的一種有效方法。Python
有一個(gè)多處理模塊,讓我們能夠跨 CPU
的不同內(nèi)核并行執(zhí)行程序。
4、實(shí)現(xiàn)
我們將使用來(lái)自 multiprocessing
模塊的 Pool
類,針對(duì)多個(gè)輸入值并行執(zhí)行一個(gè)函數(shù)。這個(gè)概念稱為數(shù)據(jù)并行性,它是 Pool
類的主要目標(biāo)。
我將使用從
Kaggle
下載的Quora
問(wèn)題對(duì)相似性數(shù)據(jù) 集來(lái)演示這個(gè)模塊。
上述數(shù)據(jù)集包含了很多在 Quora
平臺(tái)上提出的文本問(wèn)題。我將在一個(gè) Python
函數(shù)上執(zhí)行多處理模塊,這個(gè)函數(shù)通過(guò)刪除停用詞、刪除 HTML 標(biāo)簽、刪除標(biāo)點(diǎn)符號(hào)、詞干提取等過(guò)程來(lái)處理文本數(shù)據(jù)。
preprocess()
就是執(zhí)行上述文本處理步驟的函數(shù)。
可以在 這里 找到托管在我的 GitHub
上的函數(shù) preprocess()
的代碼片段。
現(xiàn)在,我們使用 multiprocessing
模塊中的 Pool
類為數(shù)據(jù)集的不同塊并行執(zhí)行該函數(shù)。數(shù)據(jù)集的每個(gè)塊都將并行處理。
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()
該數(shù)據(jù)集有 537,361
條記錄(文本問(wèn)題)需要處理。對(duì)于 50,000
的桶大小,數(shù)據(jù)集被分成 11 個(gè)較小的數(shù)據(jù)塊,這些塊可以并行處理以加快程序的執(zhí)行時(shí)間。
5、基準(zhǔn)測(cè)試
人們常問(wèn)的問(wèn)題是使用多處理模塊后執(zhí)行速度能快多少。我在實(shí)現(xiàn)了數(shù)據(jù)并行性,對(duì)整個(gè)數(shù)據(jù)集執(zhí)行一次 preprocess()
函數(shù)后對(duì)比了基準(zhǔn)執(zhí)行時(shí)間。
運(yùn)行測(cè)試的機(jī)器有 64GB 內(nèi)存和 10 個(gè) CPU 內(nèi)核。
多處理和單處理執(zhí)行的基準(zhǔn)時(shí)間:
從上圖中,我們可以觀察到 Python
函數(shù)的并行處理將執(zhí)行速度提高了近 30
倍。
我們可以在我的
GitHub
中找到用于記錄基準(zhǔn)測(cè)試數(shù)據(jù)的Python
文件。
基準(zhǔn)測(cè)試過(guò)程:
結(jié) 論:
在本文中,我們討論了 Python
中多處理模塊的實(shí)現(xiàn),該模塊可用于加速 Python
函數(shù)的執(zhí)行。添加幾行多處理代碼后,具有 537k 實(shí)例的數(shù)據(jù)集的執(zhí)行時(shí)間幾乎快了 30 倍。
處理大型數(shù)據(jù)集的時(shí)候,我建議大家使用并行處理,因?yàn)樗梢怨?jié)省大量時(shí)間并加快工作流程。
到此這篇關(guān)于幾行代碼讓 Python 函數(shù)執(zhí)行快 30 倍的文章就介紹到這了,更多相關(guān)Python
函數(shù)執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 使用遞歸的方式實(shí)現(xiàn)語(yǔ)義圖片分割功能
這篇文章主要介紹了python 使用遞歸的方式實(shí)現(xiàn)語(yǔ)義圖片分割,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Python制作腳本幫女朋友搶購(gòu)清空購(gòu)物車
這篇文章主要介紹了Python制作的搶購(gòu)清空購(gòu)物車的腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Python使用Selenium模擬瀏覽器自動(dòng)操作功能
這篇文章主要介紹了Python使用Selenium模擬瀏覽器自動(dòng)操作功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python使用poplib模塊和smtplib模塊收發(fā)電子郵件的教程
smtplib模塊一般我們比較熟悉、這里我們會(huì)來(lái)講解使用smtplib發(fā)送SSL/TLS安全郵件的方法,而poplib模塊則負(fù)責(zé)處理接收pop3協(xié)議的郵件,下面我們就來(lái)看Python使用poplib模塊和smtplib模塊收發(fā)電子郵件的教程2016-07-07Python tabulate結(jié)合loguru打印出美觀方便的日志記錄
在開發(fā)過(guò)程中經(jīng)常碰到在本地環(huán)境無(wú)法完成聯(lián)調(diào)測(cè)試的情況,必須到統(tǒng)一的聯(lián)機(jī)環(huán)境對(duì)接其他系統(tǒng)測(cè)試。往往是出現(xiàn)了BUG難以查找數(shù)據(jù)記錄及時(shí)定位到錯(cuò)誤出現(xiàn)的位置。本文將利用tabulate結(jié)合loguru實(shí)現(xiàn)打印出美觀方便的日志記錄,需要的可以參考一下2022-10-10Python 正則表達(dá)式 re.match/re.search/re.sub的使用解析
今天小編就為大家分享一篇Python 正則表達(dá)式 re.match/re.search/re.sub的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Python處理excel根據(jù)全稱自動(dòng)填寫簡(jiǎn)稱
這篇文章主要為大家詳細(xì)介紹了Python處理excel根據(jù)全稱自動(dòng)填寫簡(jiǎn)稱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Python hexstring-list-str之間的轉(zhuǎn)換方法
今天小編就為大家分享一篇Python hexstring-list-str之間的轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Django模板變量如何傳遞給外部js調(diào)用的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于Django模板變量如何傳遞給外部js調(diào)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-07-07