一区二区三区中文国产亚洲_另类视频区第一页_日韩精品免费视频_女人免费视频_国产综合精品久久亚洲

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > 提高python的運(yùn)行效率的辦法

提高python的運(yùn)行效率的辦法

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-11-06 23:42:19 1699285339

python是一門(mén)優(yōu)秀的語(yǔ)言,它能讓你在短時(shí)間內(nèi)通過(guò)極少量代碼就能完成許多操作。不僅如此,它還輕松支持多任務(wù)處理,比如多進(jìn)程。

不喜歡Python的人經(jīng)常會(huì)吐嘈Python運(yùn)行太慢。但是,事實(shí)并非如此。嘗試以下六個(gè)竅門(mén),來(lái)為你的Python應(yīng)用提速。

辦法一:關(guān)鍵代碼使用外部功能包

Python簡(jiǎn)化了許多編程任務(wù),但是對(duì)于一些時(shí)間敏感的任務(wù),它的表現(xiàn)經(jīng)常不盡人意。使用C/C++或機(jī)器語(yǔ)言的外部功能包處理時(shí)間敏感任務(wù),可以有效提高應(yīng)用的運(yùn)行效率。這些功能包往往依附于特定的平臺(tái),因此你要根據(jù)自己所用的平臺(tái)選擇合適的功能包。簡(jiǎn)而言之,這個(gè)竅門(mén)要你犧牲應(yīng)用的可移植性以換取只有通過(guò)對(duì)底層主機(jī)的直接編程才能獲得的運(yùn)行效率。以下是一些你可以選擇用來(lái)提升效率的功能包:

Cython

Pylnlne

PyPy

Pyrex

這些功能包的用處各有不同。比如說(shuō),使用C語(yǔ)言的數(shù)據(jù)類型,可以使涉及內(nèi)存操作的任務(wù)更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應(yīng)用中直接使用C代碼。內(nèi)聯(lián)代碼是獨(dú)立編譯的,但是它把所有編譯文件都保存在某處,并能充分利用C語(yǔ)言提供的高效率。

辦法二:在排序時(shí)使用鍵

Python含有許多古老的排序規(guī)則,這些規(guī)則在你創(chuàng)建定制的排序方法時(shí)會(huì)占用很多時(shí)間,而這些排序方法運(yùn)行時(shí)也會(huì)拖延程序?qū)嶋H的運(yùn)行速度。最佳的排序方法其實(shí)是盡可能多地使用鍵和內(nèi)置的sort()方法。譬如,拿下面的代碼來(lái)說(shuō):

importoperator

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)行排序的。這個(gè)方法不僅對(duì)數(shù)值類型有效,還同樣適用于字符串類型。

辦法三:針對(duì)循環(huán)的優(yōu)化

每一種編程語(yǔ)言都強(qiáng)調(diào)最優(yōu)化的循環(huán)方案。當(dāng)使用Python時(shí),你可以借助豐富的技巧讓循環(huán)程序跑得更快。然而,開(kāi)發(fā)者們經(jīng)常遺忘的一個(gè)技巧是:盡量避免在循環(huán)中訪問(wèn)變量的屬性。譬如,拿下面的代碼來(lái)說(shuō):

lowerlist=['this','is','lowercase']upper=str.upper

upperlist=[]append=upperlist.appendforwordinlowerlist:

append(upper(word))print(upperlist)#Output=['THIS','IS','LOWERCASE']

每次你調(diào)用str.upper,Python都會(huì)計(jì)算這個(gè)式子的值。然而,如果你把這個(gè)求值賦值給一個(gè)變量,那么求值的結(jié)果就能提前知道,Python程序就能運(yùn)行得更快。因此,關(guān)鍵就是盡可能減小Python在循環(huán)中的工作量。因?yàn)镻ython解釋執(zhí)行的特性,在上面的例子中會(huì)大大減慢它的速度。

(注意:優(yōu)化循環(huán)的方法還有很多,這只是其中之一。比如,很多程序員會(huì)認(rèn)為,列表推導(dǎo)式是提高循環(huán)速度的最佳方法。關(guān)鍵在于,優(yōu)化循環(huán)方案是提高應(yīng)用程序運(yùn)行速度的上佳選擇。)

辦法四:使用較新的Python版本

如果你在網(wǎng)上搜索Python,你會(huì)發(fā)現(xiàn)數(shù)不盡的信息都是關(guān)于如何升級(jí)Python版本。通常,每個(gè)版本的Python都會(huì)包含優(yōu)化內(nèi)容,使其運(yùn)行速度優(yōu)于之前的版本。但是,限制因素在于,你最喜歡的函數(shù)庫(kù)有沒(méi)有同步更新支持新的Python版本。與其爭(zhēng)論函數(shù)庫(kù)是否應(yīng)該更新,關(guān)鍵在于新的Python版本是否足夠高效來(lái)支持這一更新。

你要保證自己的代碼在新版本里還能運(yùn)行。你需要使用新的函數(shù)庫(kù)才能體驗(yàn)新的Python版本,然后你需要在做出關(guān)鍵性的改動(dòng)時(shí)檢查自己的應(yīng)用。只有當(dāng)你完成必要的修正之后,你才能體會(huì)新版本的不同。

然而,如果你只是確保自己的應(yīng)用在新版本中可以運(yùn)行,你很可能會(huì)錯(cuò)過(guò)新版本提供的新特性。一旦你決定更新,請(qǐng)分析你的應(yīng)用在新版本下的表現(xiàn),并檢查可能出問(wèn)題的部分,然后優(yōu)先針對(duì)這些部分應(yīng)用新版本的特性。只有這樣,用戶才能在更新之初就覺(jué)察到應(yīng)用性能的改觀。

辦法五:嘗試多種編碼方法

每次創(chuàng)建應(yīng)用時(shí)都使用同一種編碼方法幾乎無(wú)一例外會(huì)導(dǎo)致應(yīng)用的運(yùn)行效率不盡人意。可以在程序分析時(shí)嘗試一些試驗(yàn)性的辦法。譬如說(shuō),在處理字典中的數(shù)據(jù)項(xiàng)時(shí),你既可以使用安全的方法,先確保數(shù)據(jù)項(xiàng)已經(jīng)存在再進(jìn)行更新,也可以直接對(duì)數(shù)據(jù)項(xiàng)進(jìn)行更新,把不存在的數(shù)據(jù)項(xiàng)作為特例分開(kāi)處理。請(qǐng)看下面第一段代碼:

n=16myDict={}foriinrange(0,n):

char='abcd'[i%4]ifcharnotinmyDict:

myDict[char]=0

myDict[char]+=1print(myDict)

當(dāng)一開(kāi)始myDict為空時(shí),這段代碼會(huì)跑得比較快。然而,通常情況下,myDict填滿了數(shù)據(jù),至少填有大部分?jǐn)?shù)據(jù),這時(shí)換另一種方法會(huì)更有效率。

n=16myDict={}foriinrange(0,n):

char='abcd'[i%4]try:

myDict[char]+=1exceptKeyError:

myDict[char]=1print(myDict)

在兩種方法中輸出結(jié)果都是一樣的。區(qū)別在于輸出是如何獲得的。跳出常規(guī)的思維模式,創(chuàng)建新的編程技巧能使你的應(yīng)用更有效率。

辦法六:交叉編譯你的應(yīng)用

開(kāi)發(fā)者有時(shí)會(huì)忘記計(jì)算機(jī)其實(shí)并不理解用來(lái)創(chuàng)建現(xiàn)代應(yīng)用程序的編程語(yǔ)言。計(jì)算機(jī)理解的是機(jī)器語(yǔ)言。為了運(yùn)行你的應(yīng)用,你借助一個(gè)應(yīng)用將你所編的人類可讀的代碼轉(zhuǎn)換成機(jī)器可讀的代碼。有時(shí),你用一種諸如Python這樣的語(yǔ)言編寫(xiě)應(yīng)用,再以C++這樣的語(yǔ)言運(yùn)行你的應(yīng)用,這在運(yùn)行的角度來(lái)說(shuō),是可行的。關(guān)鍵在于,你想你的應(yīng)用完成什么事情,而你的主機(jī)系統(tǒng)能提供什么樣的資源。

Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉(zhuǎn)化成C++代碼。這樣,你就可以在native模式下執(zhí)行自己的應(yīng)用,而無(wú)需依賴于解釋器程序。你會(huì)發(fā)現(xiàn)自己的應(yīng)用運(yùn)行效率有了較大的提高,但是這會(huì)因平臺(tái)和任務(wù)的差異而有所不同。

(注意:Nuitka現(xiàn)在還處在測(cè)試階段,所以在實(shí)際應(yīng)用中請(qǐng)多加注意。實(shí)際上,當(dāng)下最好還是把它用于實(shí)驗(yàn)。此外,關(guān)于交叉編譯是否為提高運(yùn)行效率的最佳方法還存在討論的空間。開(kāi)發(fā)者已經(jīng)使用交叉編譯多年,用來(lái)提高應(yīng)用的速度。記住,每一種解決辦法都有利有弊,在把它用于生產(chǎn)環(huán)境之前請(qǐng)仔細(xì)權(quán)衡。)

在使用交叉編譯器時(shí),記得確保它支持你所用的Python版本。Nuitka支持Python2.6,2.7,3.2和3.3。為了讓解決方案生效,你需要一個(gè)Python解釋器和一個(gè)C++編譯器。Nuitka支持許多C++編譯器,其中包括MicrosoftVisualStudio,MinGW和Clang/LLVM。

交叉編譯可能造成一些嚴(yán)重問(wèn)題。比如,在使用Nuitka時(shí),你會(huì)發(fā)現(xiàn)即便是一個(gè)小程序也會(huì)消耗巨大的驅(qū)動(dòng)空間。因?yàn)镹uitka借助一系列的動(dòng)態(tài)鏈接庫(kù)(DDLs)來(lái)執(zhí)行Python的功能。因此,如果你用的是一個(gè)資源很有限的系統(tǒng),這種方法或許不太可行。

結(jié)論

前文所述的六個(gè)竅門(mén)都能幫助你創(chuàng)建運(yùn)行更有效率的Python應(yīng)用。但是銀彈是不存在的。上述的這些竅門(mén)不一定每次都能奏效。在特定的Python的版本下,有的竅門(mén)或許比其他的表現(xiàn)更好,但這有時(shí)候甚至取決于平臺(tái)的差異。你需要總結(jié)分析你的應(yīng)用,找到它效率低下的部分,然后嘗試這些竅門(mén),找到解決問(wèn)題的最佳方法。

以上內(nèi)容為大家介紹了提高python的運(yùn)行效率的辦法,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.fengjieshuijing.cn/

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
Python中的'==' 和 'is'

==和is是Python對(duì)象比較中常用的兩種方式,==比較對(duì)象的值是否相等,is比較對(duì)象的身份標(biāo)識(shí)(ID)是否相等,是否是同一個(gè)對(duì)象,是否指向同一個(gè)內(nèi)存...詳情>>

2023-11-06 23:38:43
Python內(nèi)存分配

一、前言大多數(shù)編譯型語(yǔ)言,變量在使用前必須先聲明,其中C語(yǔ)言更加苛刻:變量聲明必須位于代碼塊最開(kāi)始,且在任何其他語(yǔ)句之前。其他語(yǔ)言,想C...詳情>>

2023-11-06 22:33:55
Python 腳本自啟動(dòng)及定時(shí)任務(wù)

讓Python隨Linux開(kāi)機(jī)自動(dòng)運(yùn)行1、準(zhǔn)備好要自啟的腳本auto.py2、用root權(quán)限編輯以下文件sudovim/ect/rc.local3、在exit0上面編輯啟動(dòng)腳本的命令/u...詳情>>

2023-11-06 21:57:55
python字符串處理相關(guān)函數(shù)

python中字符串中字符大小寫(xiě)的變換:*S.lower()#小寫(xiě)*S.upper()#大寫(xiě)*S.swapcase()#大小寫(xiě)互換*S.capitalize()#首字母大寫(xiě)*String.capwor詳情>>

2023-11-06 21:54:19
如何在Linux中運(yùn)行Python源文件

一。可執(zhí)行的Python程序這部分內(nèi)容只對(duì)Linux/Unix用戶適用,不過(guò)Windows用戶可能也對(duì)程序的第一行比較好奇。首先我們需要通過(guò)chmod命令,給程序...詳情>>

2023-11-06 21:50:43