
提高Python運(yùn)行效率的六個竅門
Python是一門優(yōu)秀的語言,它能讓你在短時間內(nèi)通過極少量代碼就能完成許多操作。不僅如此,它還輕松支持多任務(wù)處理,比如多進(jìn)程。
不喜歡Python的人經(jīng)常會吐嘈Python運(yùn)行太慢。但是,事實(shí)并非如此。嘗試以下六個竅門,來為你的Python應(yīng)用提速。
竅門一:關(guān)鍵代碼使用外部功能包
Python簡化了許多編程任務(wù),但是對于一些時間敏感的任務(wù),它的表現(xiàn)經(jīng)常不盡人意。使用C/C++或機(jī)器語言的外部功能包處理時間敏感任務(wù),可以有效提高應(yīng)用的運(yùn)行效率。這些功能包往往依附于特定的平臺,因此你要根據(jù)自己所用的平臺選擇合適的功能包。簡而言之,這個竅門要你犧牲應(yīng)用的可移植性以換取只有通過對底層主機(jī)的直接編程才能獲得的運(yùn)行效率。以下是一些你可以選擇用來提升效率的功能包:
Cython
Pylnlne
PyPy
Pyrex
這些功能包的用處各有不同。比如說,使用C語言的數(shù)據(jù)類型,可以使涉及內(nèi)存操作的任務(wù)更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應(yīng)用中直接使用C代碼。內(nèi)聯(lián)代碼是獨(dú)立編譯的,但是它把所有編譯文件都保存在某處,并能充分利用C語言提供的高效率。
竅門二:在排序時使用鍵
Python含有許多古老的排序規(guī)則,這些規(guī)則在你創(chuàng)建定制的排序方法時會占用很多時間,而這些排序方法運(yùn)行時也會拖延程序?qū)嶋H的運(yùn)行速度。最佳的排序方法其實(shí)是盡可能多地使用鍵和內(nèi)置的sort()方法。譬如,拿下面的代碼來說:
import operator
somelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(0))
somelist
#Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(1))
somelist
#Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(2))
somelist
#Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],
在每段例子里,list都是根據(jù)你選擇的用作關(guān)鍵參數(shù)的索引進(jìn)行排序的。這個方法不僅對數(shù)值類型有效,還同樣適用于字符串類型。
竅門三:針對循環(huán)的優(yōu)化
每一種編程語言都強(qiáng)調(diào)最優(yōu)化的循環(huán)方案。當(dāng)使用Python時,你可以借助豐富的技巧讓循環(huán)程序跑得更快。然而,開發(fā)者們經(jīng)常遺忘的一個技巧是:盡量避免在循環(huán)中訪問變量的屬性。譬如,拿下面的代碼來說:
lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
#Output = ['THIS', 'IS', 'LOWERCASE']
每次你調(diào)用str.upper, Python都會計(jì)算這個式子的值。然而,如果你把這個求值賦值給一個變量,那么求值的結(jié)果就能提前知道,Python程序就能運(yùn)行得更快。因此,關(guān)鍵就是盡可能減小Python在循環(huán)中的工作量。因?yàn)镻ython解釋執(zhí)行的特性,在上面的例子中會大大減慢它的速度。
(注意:優(yōu)化循環(huán)的方法還有很多,這只是其中之一。比如,很多程序員會認(rèn)為,列表推導(dǎo)式是提高循環(huán)速度的最佳方法。關(guān)鍵在于,優(yōu)化循環(huán)方案是提高應(yīng)用程序運(yùn)行速度的上佳選擇。)
竅門四:使用較新的Python版本
如果你在網(wǎng)上搜索Python,你會發(fā)現(xiàn)數(shù)不盡的信息都是關(guān)于如何升級Python版本。通常,每個版本的Python都會包含優(yōu)化內(nèi)容,使其運(yùn)行速度優(yōu)于之前的版本。但是,限制因素在于,你最喜歡的函數(shù)庫有沒有同步更新支持新的Python版本。與其爭論函數(shù)庫是否應(yīng)該更新,關(guān)鍵在于新的Python版本是否足夠高效來支持這一更新。
你要保證自己的代碼在新版本里還能運(yùn)行。你需要使用新的函數(shù)庫才能體驗(yàn)新的Python版本,然后你需要在做出關(guān)鍵性的改動時檢查自己的應(yīng)用。只有當(dāng)你完成必要的修正之后,你才能體會新版本的不同。
然而,如果你只是確保自己的應(yīng)用在新版本中可以運(yùn)行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應(yīng)用在新版本下的表現(xiàn),并檢查可能出問題的部分,然后優(yōu)先針對這些部分應(yīng)用新版本的特性。只有這樣,用戶才能在更新之初就覺察到應(yīng)用性能的改觀。
竅門五:嘗試多種編碼方法
每次創(chuàng)建應(yīng)用時都使用同一種編碼方法幾乎無一例外會導(dǎo)致應(yīng)用的運(yùn)行效率不盡人意??梢栽诔绦蚍治鰰r嘗試一些試驗(yàn)性的辦法。譬如說,在處理字典中的數(shù)據(jù)項(xiàng)時,你既可以使用安全的方法,先確保數(shù)據(jù)項(xiàng)已經(jīng)存在再進(jìn)行更新,也可以直接對數(shù)據(jù)項(xiàng)進(jìn)行更新,把不存在的數(shù)據(jù)項(xiàng)作為特例分開處理。請看下面第一段代碼:
n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
if char not in myDict:
myDict[char] = 0
myDict[char] += 1
print(myDict)
當(dāng)一開始myDict為空時,這段代碼會跑得比較快。然而,通常情況下,myDict填滿了數(shù)據(jù),至少填有大部分?jǐn)?shù)據(jù),這時換另一種方法會更有效率。
n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
try:
myDict[char] += 1
except KeyError:
myDict[char] = 1
print(myDict)
在兩種方法中輸出結(jié)果都是一樣的。區(qū)別在于輸出是如何獲得的。跳出常規(guī)的思維模式,創(chuàng)建新的編程技巧能使你的應(yīng)用更有效率。
竅門六:交叉編譯你的應(yīng)用
開發(fā)者有時會忘記計(jì)算機(jī)其實(shí)并不理解用來創(chuàng)建現(xiàn)代應(yīng)用程序的編程語言。計(jì)算機(jī)理解的是機(jī)器語言。為了運(yùn)行你的應(yīng)用,你借助一個應(yīng)用將你所編的人類可讀的代碼轉(zhuǎn)換成機(jī)器可讀的代碼。有時,你用一種諸如Python這樣的語言編寫應(yīng)用,再以C++這樣的語言運(yùn)行你的應(yīng)用,這在運(yùn)行的角度來說,是可行的。關(guān)鍵在于,你想你的應(yīng)用完成什么事情,而你的主機(jī)系統(tǒng)能提供什么樣的資源。
Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉(zhuǎn)化成C++代碼。這樣,你就可以在native模式下執(zhí)行自己的應(yīng)用,而無需依賴于解釋器程序。你會發(fā)現(xiàn)自己的應(yīng)用運(yùn)行效率有了較大的提高,但是這會因平臺和任務(wù)的差異而有所不同。
(注意:Nuitka現(xiàn)在還處在測試階段,所以在實(shí)際應(yīng)用中請多加注意。實(shí)際上,當(dāng)下最好還是把它用于實(shí)驗(yàn)。此外,關(guān)于交叉編譯是否為提高運(yùn)行效率的最佳方法還存在討論的空間。開發(fā)者已經(jīng)使用交叉編譯多年,用來提高應(yīng)用的速度。記住,每一種解決辦法都有利有弊,在把它用于生產(chǎn)環(huán)境之前請仔細(xì)權(quán)衡。)
在使用交叉編譯器時,記得確保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3。為了讓解決方案生效,你需要一個Python解釋器和一個C++編譯器。Nuitka支持許多C++編譯器,其中包括Microsoft Visual Studio, MinGW 和 Clang/LLVM。
交叉編譯可能造成一些嚴(yán)重問題。比如,在使用Nuitka時,你會發(fā)現(xiàn)即便是一個小程序也會消耗巨大的驅(qū)動空間。因?yàn)镹uitka借助一系列的動態(tài)鏈接庫(DDLs)來執(zhí)行Python的功能。因此,如果你用的是一個資源很有限的系統(tǒng),這種方法或許不太可行。
結(jié)論
前文所述的六個竅門都能幫助你創(chuàng)建運(yùn)行更有效率的Python應(yīng)用。但是銀彈是不存在的。上述的這些竅門不一定每次都能奏效。在特定的Python的版本下,有的竅門或許比其他的表現(xiàn)更好,但這有時候甚至取決于平臺的差異。你需要總結(jié)分析你的應(yīng)用,找到它效率低下的部分,然后嘗試這些竅門,找到解決問題的最佳方法。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03