最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

提升Python程序運(yùn)行效率的6個(gè)方法

 更新時(shí)間:2015年03月31日 10:55:10   作者:John Paul Mueller  
這篇文章主要介紹了提升Python程序運(yùn)行效率的6個(gè)方法,包括依賴外部擴(kuò)展、代碼優(yōu)化等內(nèi)容,需要的朋友可以參考下

Python是一個(gè)很酷的語(yǔ)言,因?yàn)槟憧梢栽诤芏痰臅r(shí)間內(nèi)利用很少的代碼做很多事情。不僅如此,它還能輕松地支持多任務(wù),比如多進(jìn)程等。Python批評(píng)者有時(shí)會(huì)說(shuō)Python執(zhí)行緩慢。本文將嘗試介紹6個(gè)技巧,可加速你的Python應(yīng)用程序。
1.讓關(guān)鍵代碼依賴于外部包

雖然Python讓許多編程任務(wù)變得容易,但它可能并不總能為緊急的任務(wù)提供最佳性能。你可以為緊急的任務(wù)使用C、C++或機(jī)器語(yǔ)言編寫(xiě)的外部包,這樣可以提高應(yīng)用程序的性能。這些包都是不能跨平臺(tái)的,這意味著你需要根據(jù)你正在使用的平臺(tái),尋找合適的包。簡(jiǎn)而言之,這個(gè)方案放棄了一些應(yīng)用程序的可移植性,以換取只有在特定主機(jī)上直接編程才能獲得的程序性能。這里有一些你應(yīng)該考慮加入到你的“性能兵工廠”的包:

這些包以不同的方式提高性能。例如,Pyrex能夠擴(kuò)展Python所能做的事情,例如使用C的數(shù)據(jù)類型來(lái)讓內(nèi)存任務(wù)更加有效或直接。PyInIne讓你在Python應(yīng)用程序中直接使用C代碼。程序中的內(nèi)聯(lián)代碼單獨(dú)編譯,但它在利用C語(yǔ)言所能提供的效率的同時(shí),也讓所有的代碼都在同一個(gè)地方。
2.排序時(shí)使用鍵(key)

有很多老的Python排序代碼,它們?cè)谀銊?chuàng)建一個(gè)自定義的排序時(shí)花費(fèi)你的時(shí)間,但在運(yùn)行時(shí)確實(shí)能加速執(zhí)行排序過(guò)程。元素排序的最好方法是盡可能使用鍵(key)和默認(rèn)的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)],

每一個(gè)實(shí)例中,根據(jù)你選擇的作為key參數(shù)部分的索引,數(shù)組進(jìn)行了排序。類似于利用數(shù)字進(jìn)行排序,這種方法同樣適用于利用字符串排序。
3.優(yōu)化循環(huán)

每種編程語(yǔ)言都會(huì)強(qiáng)調(diào)需要優(yōu)化循環(huán)。當(dāng)使用Python的時(shí)候,你可以依靠大量的技巧使得循環(huán)運(yùn)行得更快。然而,開(kāi)發(fā)者經(jīng)常漏掉的一個(gè)方法是:避免在一個(gè)循環(huán)中使用點(diǎ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都會(huì)求該方法的值。然而,如果你用一個(gè)變量代替求得的值,值就變成了已知的,Python就可以更快地執(zhí)行任務(wù)。優(yōu)化循環(huán)的關(guān)鍵,是要減少Python在循環(huán)內(nèi)部執(zhí)行的工作量,因?yàn)镻ython原生的解釋器在那種情況下,真的會(huì)減緩執(zhí)行的速度。

(注意:優(yōu)化循環(huán)的方法有很多,這只是其中的一個(gè)。例如,許多程序員都會(huì)說(shuō),列表推導(dǎo)是在循環(huán)中提高執(zhí)行速度的最好方式。這里的關(guān)鍵是,優(yōu)化循環(huán)是程序取得更高的執(zhí)行速度的更好方式之一。)
4.使用較新版本的Python

在網(wǎng)上搜索Python信息,都會(huì)發(fā)現(xiàn)無(wú)數(shù)人在問(wèn),從Python一個(gè)版本遷移到另一個(gè)版本的問(wèn)題的信息。一般來(lái)說(shuō),Python的每一個(gè)版本都包含了能讓其比上個(gè)版本運(yùn)行更快的優(yōu)化。版本遷移的限制因素是,你喜歡的那些庫(kù)是否已經(jīng)遷移到Python的較新版本。相比于詢問(wèn)是否應(yīng)該進(jìn)行版本遷移,關(guān)鍵問(wèn)題是確定一個(gè)新版本什么時(shí)候有足夠的支持,以保證遷移的可行性。

你需要驗(yàn)證你的代碼仍然運(yùn)行。你需要在Python的新版本下使用你獲得的新庫(kù),然后檢查你的應(yīng)用程序是否需要重大改變。只有在你作出必要的更正之后,你才會(huì)注意到版本之間的差別。然而,如果你正好確保你的應(yīng)用程序能在新版本下運(yùn)行,而不需要任何改變,你可能會(huì)錯(cuò)過(guò)那些版本升級(jí)帶來(lái)的新特性。一旦你進(jìn)行了遷移,你應(yīng)該為你的新版本下的應(yīng)用程序?qū)懸粋€(gè)說(shuō)明,檢查有問(wèn)題的地方,并且優(yōu)先考慮利用新版本的特性去更新那些地方。這樣用戶將會(huì)在升級(jí)的過(guò)程中更早的看到一個(gè)更大的性能提升。
5.嘗試多種編碼方法

如果每次你創(chuàng)建一個(gè)應(yīng)用程序都是用相同的編碼方法,幾乎肯定會(huì)導(dǎo)致一些你的應(yīng)用程序比它能夠達(dá)到的運(yùn)行效率慢的情況。作為分析過(guò)程的一部分,你可以嘗試一些實(shí)驗(yàn)。例如,在一個(gè)字典中管理一些元素,你可以采用安全的方法確定元素是否已經(jīng)存在并更新,或者你可以直接添加元素,然后作為異常處理該元素不存在情況??紤]第一個(gè)編碼的例子:

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)

這段代碼通常會(huì)在myDict開(kāi)始為空時(shí)運(yùn)行得更快。然而,當(dāng)mydict通常被數(shù)據(jù)填充(或者至少大部分被充填)時(shí),另一種方法效果更好。

n = 16
myDict = {}
for i in range(0, n):
  char = 'abcd'[i%4]
  try:
    myDict[char] += 1
  except KeyError:
    myDict[char] = 1
  print(myDict)

兩種情況下具有相同的輸出:{‘d': 4, ‘c': 4, ‘b': 4, ‘a(chǎn)': 4}。唯一的不同是這個(gè)輸出是如何得到的。跳出固定的思維模式,創(chuàng)造新的編碼技巧,能夠幫助你利用你的應(yīng)用程序獲得更快的結(jié)果。
6.交叉編譯應(yīng)用程序

開(kāi)發(fā)者有時(shí)會(huì)忘記,電腦實(shí)際上是不懂任何用于創(chuàng)建現(xiàn)代應(yīng)用程序的語(yǔ)言,電腦所能懂得是機(jī)器代碼。為了能在電腦上運(yùn)行應(yīng)用程序,你使用一個(gè)應(yīng)用將人類可讀的代碼你轉(zhuǎn)換成計(jì)算機(jī)能理解的。有時(shí)候用一種語(yǔ)言,比如Python,寫(xiě)一個(gè)應(yīng)用,并用另一種語(yǔ)言,比如C++,運(yùn)行它,從性能的角度來(lái)看是有意義的。這取決于你想要應(yīng)用程序去做什么,以及主機(jī)系統(tǒng)可以提供的資源。

一個(gè)有趣的交叉編譯器,Nuitka,可以將你的Python代碼轉(zhuǎn)換為C++代碼。這么做的結(jié)果是,你可以在原生模式下執(zhí)行應(yīng)用程序,而不是依靠解釋器。根據(jù)平臺(tái)和任務(wù),你可以看到一個(gè)顯著的性能提升。

(注意:Nuitka目前還處于測(cè)試階段,所以用它來(lái)產(chǎn)品程序時(shí)需要小心。實(shí)際上,目前最好將其用于實(shí)驗(yàn)。現(xiàn)在也有一些關(guān)于交叉編譯是否是得到更好性能的最佳方式的討論。開(kāi)發(fā)者已經(jīng)利用交叉編譯好幾年了,目的是實(shí)現(xiàn)特定的目標(biāo),比如更好的應(yīng)用程序的速度。記住,每一個(gè)解決方案都會(huì)有得有失,你應(yīng)該在將一個(gè)解決方案用于生產(chǎn)環(huán)境之前就好好考慮一下得失情況。)

在使用一個(gè)交叉編譯器時(shí),要確保它支持你使用的Python的版本。Nuitka支持Python2.6、2.7、3.2和3.3。想讓這個(gè)方案發(fā)揮作用,你需要一個(gè)Python解釋器和一個(gè)C++編譯器。Nuitka支持多種C++編譯器,包括Microsoft Visual Studio、MinGW 和 Clang/LLVM。

交叉編譯也可能帶來(lái)一些嚴(yán)重的負(fù)面影響。例如,當(dāng)利用Nuitka工作時(shí),你會(huì)發(fā)現(xiàn)即使一個(gè)小程序也能消耗很大的硬盤(pán)空間,這是因?yàn)镹uitka使用大量的動(dòng)態(tài)鏈接庫(kù)(DLLs)實(shí)現(xiàn)Python的功能。所以當(dāng)你面對(duì)一個(gè)資源有限的系統(tǒng)時(shí),這個(gè)方案可能不會(huì)很好的起作用。
總結(jié)

這六個(gè)技巧中的任意一個(gè),都可以幫助你創(chuàng)造更快的Python程序。但任何技巧都不是萬(wàn)能的,不能每次都起作用。有些技巧在Python的特定版本下比其他技巧的更有效——甚至系統(tǒng)平臺(tái)也能影響它們的效果。你需要配置你的應(yīng)用,確定哪個(gè)地方讓其運(yùn)行緩慢,然后嘗試似乎能最好的解決這些問(wèn)題的一些技巧。

相關(guān)文章

  • Python如何實(shí)現(xiàn)PDF隱私信息檢測(cè)

    Python如何實(shí)現(xiàn)PDF隱私信息檢測(cè)

    隨著越來(lái)越多的個(gè)人信息以電子形式存儲(chǔ)和傳輸,確保這些信息的安全至關(guān)重要,本文將介紹如何使用Python檢測(cè)PDF文件中的隱私信息,需要的可以參考下
    2025-02-02
  • python基于gevent實(shí)現(xiàn)并發(fā)下載器代碼實(shí)例

    python基于gevent實(shí)現(xiàn)并發(fā)下載器代碼實(shí)例

    這篇文章主要介紹了python基于gevent實(shí)現(xiàn)并發(fā)下載器代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Jupyter notebook 啟動(dòng)閃退問(wèn)題的解決

    Jupyter notebook 啟動(dòng)閃退問(wèn)題的解決

    這篇文章主要介紹了Jupyter notebook 啟動(dòng)閃退問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能

    python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能

    這篇文章主要介紹了python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python實(shí)現(xiàn)備份目錄的方法

    python實(shí)現(xiàn)備份目錄的方法

    這篇文章主要介紹了python實(shí)現(xiàn)備份目錄的方法,實(shí)例總結(jié)了Python實(shí)現(xiàn)備份目錄的三種常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 三分鐘熟練使用Python的os.path.join()

    三分鐘熟練使用Python的os.path.join()

    在Python中os.path.join()函數(shù)用于將多個(gè)路徑組合成一個(gè)路徑,下面這篇文章主要給大家介紹了關(guān)于熟練使用Python的os.path.join()的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報(bào)錯(cuò)

    導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報(bào)錯(cuò)

    這篇文章主要介紹了導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報(bào)錯(cuò),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python開(kāi)發(fā)常用五種循環(huán)方式的場(chǎng)景性能比較

    Python開(kāi)發(fā)常用五種循環(huán)方式的場(chǎng)景性能比較

    Python是一門(mén)高級(jí)編程語(yǔ)言,其擁有多種循環(huán)方式,如for循環(huán)、while循環(huán)、do-while循環(huán)等。本文將逐個(gè)分析Python所有的循環(huán)執(zhí)行效率和適用場(chǎng)景,需要的可以參考一下
    2023-04-04
  • python實(shí)現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類

    python實(shí)現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類

    這篇文章主要介紹了python實(shí)現(xiàn)提取COCO,VOC數(shù)據(jù)集中特定的類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python中網(wǎng)絡(luò)請(qǐng)求中Retry策略實(shí)現(xiàn)方式

    Python中網(wǎng)絡(luò)請(qǐng)求中Retry策略實(shí)現(xiàn)方式

    這篇文章主要介紹了Python中網(wǎng)絡(luò)請(qǐng)求中Retry策略實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論

徐州市| 永兴县| 襄城县| 梅河口市| 九江县| 温州市| 文昌市| 长汀县| 芷江| 洛川县| 凌源市| 兰溪市| 上高县| 岱山县| 苍溪县| 济阳县| 嘉定区| 宜章县| 泸溪县| 谢通门县| 安康市| 兴城市| 修文县| 东山县| 宜丰县| 镇坪县| 淮北市| 容城县| 温州市| 辉县市| 芦山县| 苗栗市| 鹤山市| 涿州市| 垦利县| 景德镇市| 姜堰市| 乌恰县| 亚东县| 宁强县| 华安县|