python源碼多平臺編譯_提升Python程序運行效率的6個方法

Python是一個很酷的語言,因為你可以在很短的時間內利用很少的代碼做很多事情。不僅如此,它還能輕松地支持多任務,比如多進程等。Python批評者有時會說Python執行緩慢。本文將嘗試介紹6個技巧,可加速你的Python應用程序。

1.讓關鍵代碼依賴于外部包

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

Cython

PyInlne

PyPy

Pyrex

這些包以不同的方式提高性能。例如,Pyrex能夠擴展Python所能做的事情,例如使用C的數據類型來讓內存任務更加有效或直接。PyInIne讓你在Python應用程序中直接使用C代碼。程序中的內聯代碼單獨編譯,但它在利用C語言所能提供的效率的同時,也讓所有的代碼都在同一個地方。

2.排序時使用鍵(key)

有很多老的Python排序代碼,它們在你創建一個自定義的排序時花費你的時間,但在運行時確實能加速執行排序過程。元素排序的最好方法是盡可能使用鍵(key)和默認的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)],

每一個實例中,根據你選擇的作為key參數部分的索引,數組進行了排序。類似于利用數字進行排序,這種方法同樣適用于利用字符串排序。

3.優化循環

每種編程語言都會強調需要優化循環。當使用Python的時候,你可以依靠大量的技巧使得循環運行得更快。然而,開發者經常漏掉的一個方法是:避免在一個循環中使用點操作。例如,考慮下面的代碼:

lowerlist = ['this', 'is', 'lowercase']

upper = str.upper

upperlist = []

append = upperlist.append

for word in lowerlist:

append(upper(word))

print(upperlist)

#Output = ['THIS', 'IS', 'LOWERCASE']

每一次你調用方法str.upper,Python都會求該方法的值。然而,如果你用一個變量代替求得的值,值就變成了已知的,Python就可以更快地執行任務。優化循環的關鍵,是要減少Python在循環內部執行的工作量,因為Python原生的解釋器在那種情況下,真的會減緩執行的速度。

(注意:優化循環的方法有很多,這只是其中的一個。例如,許多程序員都會說,列表推導是在循環中提高執行速度的最好方式。這里的關鍵是,優化循環是程序取得更高的執行速度的更好方式之一。)

4.使用較新版本的Python

在網上搜索Python信息,都會發現無數人在問,從Python一個版本遷移到另一個版本的問題的信息。一般來說,Python的每一個版本都包含了能讓其比上個版本運行更快的優化。版本遷移的限制因素是,你喜歡的那些庫是否已經遷移到Python的較新版本。相比于詢問是否應該進行版本遷移,關鍵問題是確定一個新版本什么時候有足夠的支持,以保證遷移的可行性。

你需要驗證你的代碼仍然運行。你需要在Python的新版本下使用你獲得的新庫,然后檢查你的應用程序是否需要重大改變。只有在你作出必要的更正之后,你才會注意到版本之間的差別。然而,如果你正好確保你的應用程序能在新版本下運行,而不需要任何改變,你可能會錯過那些版本升級帶來的新特性。一旦你進行了遷移,你應該為你的新版本下的應用程序寫一個說明,檢查有問題的地方,并且優先考慮利用新版本的特性去更新那些地方。這樣用戶將會在升級的過程中更早的看到一個更大的性能提升。

5.嘗試多種編碼方法

如果每次你創建一個應用程序都是用相同的編碼方法,幾乎肯定會導致一些你的應用程序比它能夠達到的運行效率慢的情況。作為分析過程的一部分,你可以嘗試一些實驗。例如,在一個字典中管理一些元素,你可以采用安全的方法確定元素是否已經存在并更新,或者你可以直接添加元素,然后作為異常處理該元素不存在情況。考慮第一個編碼的例子:

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)

這段代碼通常會在myDict開始為空時運行得更快。然而,當mydict通常被數據填充(或者至少大部分被充填)時,另一種方法效果更好。

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': 4}。唯一的不同是這個輸出是如何得到的。跳出固定的思維模式,創造新的編碼技巧,能夠幫助你利用你的應用程序獲得更快的結果。

6.交叉編譯應用程序

開發者有時會忘記,電腦實際上是不懂任何用于創建現代應用程序的語言,電腦所能懂得是機器代碼。為了能在電腦上運行應用程序,你使用一個應用將人類可讀的代碼你轉換成計算機能理解的。有時候用一種語言,比如Python,寫一個應用,并用另一種語言,比如C++,運行它,從性能的角度來看是有意義的。這取決于你想要應用程序去做什么,以及主機系統可以提供的資源。

一個有趣的交叉編譯器,Nuitka,可以將你的Python代碼轉換為C++代碼。這么做的結果是,你可以在原生模式下執行應用程序,而不是依靠解釋器。根據平臺和任務,你可以看到一個顯著的性能提升。

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

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

交叉編譯也可能帶來一些嚴重的負面影響。例如,當利用Nuitka工作時,你會發現即使一個小程序也能消耗很大的硬盤空間,這是因為Nuitka使用大量的動態鏈接庫(DLLs)實現Python的功能。所以當你面對一個資源有限的系統時,這個方案可能不會很好的起作用。

總結

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

本文標題: 提升Python程序運行效率的6個方法

本文地址: http://www.cppcns.com/jiaoben/python/121803.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 高并發彈幕,高并發實時直播彈幕研發實踐

高并發實時直播彈幕研發實踐直播間特點聊天室限制人數的原因應對萬級以上的實時互動跨服務器是為了解決單一服務器接入數量限制、發布消息吞吐限制等問題;多進程并發則是為了充分利用多核CPU以及減小一個循環規模從而達到降低延遲的目的。云巴實時系統的設計云巴是基…

linux python3_在Linux上安裝Python 3

在Linux上安裝Python 3這份文檔描述了如何在Ubuntu Linux機器上安裝Python 3.6。 想要獲取已安裝的Python 3版本號,可以通過終端運行命令: $ python3 --version 如果您使用的是Ubuntu 16.10或更新,可以通過以下命令簡單地安裝Python 3.6: $ s…

android手機電話鈴聲設置,安卓手機鈴聲怎么設置

網上有很多安卓手機鈴聲的設置教程,說什么SD卡里建立這個那個的文件夾,那問題是怎么才能進到SD卡里去建立文件夾啊?手機里哪個選項里進去呢?這里小編告訴你,可以通過電腦連接數據線管理SD卡。下面介紹兩種簡單的設置安…

安裝squid_「首席推薦」設置Squid轉發代理或者正向代理

如果您正在閱讀這篇文章,您可能會因為缺少與Squid相關的信息而感到沮喪,Squid是一種非常流行的轉發代理。這些令人沮喪的事情包括:在小的軟件修訂之后出現的重大的可用性變化,對幕后發生的事情的誤解,以及真正糟糕的文檔。這是一個…

android壓縮圖片質量,Android 圖片質量壓縮有關問題

Android 圖片質量壓縮問題本帖最后由 u013064347 于 2014-01-13 10:22:47 編輯網上看到一個圖片質量壓縮法,傳入1M以內圖片能正常壓縮,但是傳入2M多的圖片就報內存溢出,應該怎么解決?附上代碼Bitmap imagesBitmapFactory.decodeFi…

python標準庫os_Python基礎--人們一些最愛的標準庫(sys os fileinput)

這篇博客就介紹介紹常見的、人們鐘愛的python中的標準庫。 sys 從字面上也能看出來,是system的縮寫。這個模塊能夠訪問與python解析器緊密聯系的變量和函數。 argv 命令行參數 exit 退出當前程序 modules 映射模塊名到載入模塊的字典 path 目錄 platform 平臺標識符…

android區域截圖app,【干貨】最新App應用市場截圖尺寸大全

今天給大家分享最新的干貨,剛好碰上這段時間設計市場截圖,所以給各位設計新人,分享本人整合的尺寸大全,希望對你們的設計之路有所幫助。一、IOS App Store尺寸尺寸(機型) 大小(px)3.5寸(iphone4/4s)…

python如何運行一個python程序_在python中,如何運行一個命令行程序,它在發送Ctrl+D之前不會返回...

由于沒有人提供任何代碼來幫助解決這個問題,我將做如下的事情。結果發現pexpect非常強大,而且您不需要signal模塊。在import os import sys import pexpect def run_server(): server_dir /path/to/server/root current_dir os.path.abspath(os.curdir…

android app外喚起,Android 喚起app的多種方式

方式一(通過Intent喚起):我們自己的app代碼:ComponentName componetName new ComponentName("com.lh.jimtrency.webviewdemo","com.lh.jimtrency.webviewdemo.MainActivity");//(另外一個應用程序的包名,要啟動的Activi…

2018python做圖形界面哪個庫簡單_2018年常見的python編程開發庫都有哪些類型

python編程開發可以說是目前比較熱門的一項編程開發語言了,而今天我們就一起來了解一下,關于python編程都有哪些常見的python庫可以使用。1、TensorFlow “TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖形節點表示數學運算,而圖…

android條形圖,MPAndroid組條形圖未顯示

這個問題已經在這里有了答案:????????????>????????????How to check if activity is in foreground or in visible background?????????????????????????????????????22個這是我用于使用MPAndroi…

c++ socket線程池_java 網絡編程,Socket編程

Java的網絡編程主要涉及到的內容是Socket編程,那么什么是Socket呢?簡單地說,Socket,套接字,就是兩臺主機之間邏輯連接的端點。TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應…

android簽名忘記密碼,修改Android簽名證書keystore的密碼、別名alias以及別名密碼

之前在測試Eclipse ADT的Custom debug Eclipse ADT的Custom debug keystore所需證書規格,提到過自定義調試證書的密碼和1. 首先當然是先復制一份正式證書出來作為要修改為的臨時調試證書。2. 修改keystore密碼的命令(keytool為JDK帶的命令行工具):keytoo…

python列表轉換成數字_Python中列表元素轉為數字的方法分析

本文實例講述了Python中列表元素轉為數字的方法。分享給大家供大家參考,具體如下: 有一個數字字符的列表: numbers [1, 5, 10, 8] 想要把每個元素轉換為數字: numbers [1, 5, 10, 8] 用一個循環來解決: new_numbers …

android 繪圖軟件,安卓最強大的繪圖軟件 妙筆生花最新評測

妙筆生花——繪畫體驗(一)看過使用教程之后,就能進入到真正的功能頁面了。功能頁面的首頁只有一個按鈕,點擊頁面下端的這個按鈕之后,就能跳出功能強大的工具選擇頁面。【妙筆生花】——工具選擇頁OK,接下來,小編會使用…

識別物體是否存在_【科學實踐Vol.1】帶你玩轉“人臉識別”

隨著時代的發展,人臉識別在我們的生活中變得隨處可見:商場里的人臉識別儲物柜,校園里的人臉識別刷卡機,手機里的面部解鎖……這些應用極大的便利了我們的日常生活。今天,就讓我們一起走進人臉識別的原理世界。首先我們…

html 自動適應手機屏幕大小,HTML5 canvas自適應手機屏幕大小的一種解決方案

一、最終效果為了不浪費大家時間,先展示最終效果,看看是不是大家需要的解決方案:標準分辨率:其他分辨率的適配情況:二、需求1.canvas的內容能全部展示在屏幕上2.盡量能保證圖像不變形3.繪制的文字也能自適應三、解決方…

編寫一個能夠排序的函數模板。_LeetCode刷題——9.給出n對括號,請編寫一個函數來生成所有的由n對括號組成的合法組合...

難度(medium)題目描述:給出n對括號,請編寫一個函數來生成所有的由n對括號組成的合法組合。例如n3,解集為: "((()))", "(()())", "(())()", "()(())", "()()()" 思路&#xf…

html5怎么產生手風琴效果,Html5 js如何實現手風琴效果

Html5 js如何實現手風琴效果發布時間:2020-08-03 09:54:10來源:億速云閱讀:92作者:小豬這篇文章主要為大家展示了Html5 js如何實現手風琴效果,內容簡而易懂,希望大家可以學習一下,學習完之后肯定…

c++進制轉換_一文了解進制之間的原理和轉換

點擊這段文字: 獲取2020年,最強Python學習資料進制這塊,可以做簡單的了解。生活中我們使用的數字都是十進制的,而二進制是機器能夠識別的最直接的語言。但是二進制又太大,記錄起來非常的不方便。所以通常會將二進制轉化…