曾靈敏 — may 18, 2015
python是一門優秀的語言,它能讓你在短時間內通過極少量**就能完成許多操作。不僅如此,它還輕鬆支援多工處理,比如多程序。
不喜歡python的人經常會吐嘈python執行太慢。但是,事實並非如此。嘗試以下六個竅門,來為你的python應用提速。
python簡化了許多程式設計任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用c/c++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的執行效率。這些功能包往往依附於特定的平台,因此你要根據自己所用的平台選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接程式設計才能獲得的執行效率。以下是一些你可以選擇用來提公升效率的功能包:
這些功能包的用處各有不同。比如說,使用c語言的資料型別,可以使涉及記憶體操作的任務更高效或者更直觀。pyrex就能幫助python延展出這樣的功能。pylnline能使你在python應用中直接使用c**。內聯**是獨立編譯的,但是它把所有編譯檔案都儲存在某處,並能充分利用c語言提供的高效率。
python含有許多古老的排序規則,這些規則在你建立定製的排序方法時會占用很多時間,而這些排序方法執行時也會拖延程式實際的執行速度。最佳的排序方法其實是盡可能多地使用鍵和內建的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都是根據你選擇的用作關鍵引數的索引進行排序的。這個方法不僅對數值型別有效,還同樣適用於字串型別。
每一種程式語言都強調最優化的迴圈方案。當使用python時,你可以借助豐富的技巧讓迴圈程式跑得更快。然而,開發者們經常遺忘的乙個技巧是:盡量避免在迴圈中訪問變數的屬性。譬如,拿下面的**來說:
lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist =
for word in lowerlist:
print(upperlist)
#output = ['this', 'is', 'lowercase']
每次你呼叫str.upper, python都會計算這個式子的值。然而,如果你把這個求值賦值給乙個變數,那麼求值的結果就能提前知道,python程式就能執行得更快。因此,關鍵就是盡可能減小python在迴圈中的工作量。因為python解釋執行的特性,在上面的例子中會大大減慢它的速度。
(注意:優化迴圈的方法還有很多,這只是其中之一。比如,很多程式設計師會認為,列表推導式是提高迴圈速度的最佳方法。關鍵在於,優化迴圈方案是提高應用程式執行速度的上佳選擇。)
如果你在網上搜尋python,你會發現數不盡的資訊都是關於如何公升級python版本。通常,每個版本的python都會包含優化內容,使其執行速度優於之前的版本。但是,限制因素在於,你最喜歡的函式庫有沒有同步更新支援新的python版本。與其爭論函式庫是否應該更新,關鍵在於新的python版本是否足夠高效來支援這一更新。
你要保證自己的**在新版本裡還能執行。你需要使用新的函式庫才能體驗新的python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。只有當你完成必要的修正之後,你才能體會新版本的不同。
然而,如果你只是確保自己的應用在新版本中可以執行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應用在新版本下的表現,並檢查可能出問題的部分,然後優先針對這些部分應用新版本的特性。只有這樣,使用者才能在更新之初就覺察到應用效能的改觀。
每次建立應用時都使用同一種編碼方法幾乎無一例外會導致應用的執行效率不盡人意。可以在程式分析時嘗試一些試驗性的辦法。譬如說,在處理字典中的資料項時,你既可以使用安全的方法,先確保資料項已經存在再進行更新,也可以直接對資料項進行更新,把不存在的資料項作為特例分開處理。請看下面第一段**:
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)
在兩種方法中輸出結果都是一樣的。區別在於輸出是如何獲得的。跳出常規的思維模式,建立新的程式設計技巧能使你的應用更有效率。
開發者有時會忘記計算機其實並不理解用來建立現代應用程式的程式語言。計算機理解的是機器語言。為了執行你的應用,你借助乙個應用將你所編的人類可讀的**轉換成機器可讀的**。有時,你用一種諸如python這樣的語言編寫應用,再以c++這樣的語言執行你的應用,這在執行的角度來說,是可行的。關鍵在於,你想你的應用完成什麼事情,而你的主機系統能提供什麼樣的資源。
nuitka
是一款有趣的交叉編譯器,能將你的python**轉化成c++**。這樣,你就可以在native模式下執行自己的應用,而無需依賴於直譯器程式。你會發現自己的應用執行效率有了較大的提高,但是這會因平台和任務的差異而有所不同。
(注意:nuitka
現在還處在測試階段,所以在實際應用中請多加注意。實際上,當下最好還是把它用於實驗。此外,關於交叉編譯是否為提高執行效率的最佳方法還存在討論的空間。開發者已經使用交叉編譯多年,用來提高應用的速度。記住,每一種解決辦法都有利有弊,在把它用於生產環境之前請仔細權衡。)
在使用交叉編譯器時,記得確保它支援你所用的python版本。nuitka支援python2.6, 2.7, 3.2和3.3。為了讓解決方案生效,你需要乙個python直譯器和乙個c++編譯器。nuitka支援許多c++編譯器,其中包括microsoft visual studio
,mingw
和clang/llvm
。
交叉編譯可能造成一些嚴重問題。比如,在使用nuitka時,你會發現即便是乙個小程式也會消耗巨大的驅動空間。因為nuitka借助一系列的動態鏈結庫(ddls)來執行python的功能。因此,如果你用的是乙個資源很有限的系統,這種方法或許不太可行。
結論前文所述的六個竅門都能幫助你建立執行更有效率的python應用。但是銀彈是不存在的。上述的這些竅門不一定每次都能奏效。在特定的python的版本下,有的竅門或許比其他的表現更好,但這有時候甚至取決於平台的差異。你需要總結分析你的應用,找到它效率低下的部分,然後嘗試這些竅門,找到解決問題的最佳方法。
六個office技巧助你提高工作效率
資訊社會講究的就是工作效率,要想不斷提高工作效率,除了掌握日常辦公軟體的正確使用外,熟練運用它的各項技巧也是關鍵所在。1.微移技巧 平時用游標鍵移動word文件中的 自選圖形或藝術字時它都是乙個字元乙個字元 移動 無法實現精確排版,這時如果用滑鼠選定它再用 ctrl 游標鍵 就可使物件乙個畫素乙個畫...
提高python執行效率的方法
python上手很容易,但是在使用過程中,怎麼才能使效率變高呢?下面說一下提高python執行效率的方法,這裡只是說一點,python在引入模組過程中提高效率的方法。例如 1.我們要使用os模組中的某個屬性,那我們可以單獨引入os中某個屬性 from os import version 同樣的我們也...
python 多程序 提高執行效率
python 是一種非常流行的程式語言,但是python 的效率卻並不是非常的理想,這時候就非常有必要使用多程序來提高python 的執行效率。匯入多程序的模組 from multiprocessing import process 多程序模組 from multiprocessing import...