1. 程式人生 > >提升Python執行效率的小竅門

提升Python執行效率的小竅門

說起Python,作為一門大熱的程式語言,它簡單易學、語法優美,自身擁有豐富強大的庫,而且應用範圍也是十分廣泛。毫無疑問,Python 確實有用很多的優點,每一個優點看起來都非常吸引人。


但是,Python 並不是沒有缺點的,最主要的缺點之一就是Python 的執行速度不夠快。針對這個問題,下面為大家蒐集了6個可以提高Python執行效率的小竅門。


竅門一:關鍵程式碼使用外部功能包

Python簡化了許多程式設計任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的執行效率。

這些功能包往往依附於特定的平臺,因此你要根據自己所用的平臺選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接程式設計才能獲得的執行效率

以下是一些你可以選擇用來提升效率的功能包:

  • Cython

  • Pylnlne

  • PyPy

  • Pyrex

這些功能包的用處各有不同。比如說,使用C語言的資料型別,可以使涉及記憶體操作的任務更高效或者更直觀。


Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應用中直接使用C程式碼。內聯程式碼是獨立編譯的,但是它把所有編譯檔案都儲存在某處,並能充分利用C語言提供的高效率。


竅門二:在排序時使用鍵

Python含有許多古老的排序規則,這些規則在你建立定製的排序方法時會佔用很多時間,而這些排序方法執行時也會拖延程式實際的執行速度。最佳的排序方法其實是儘可能多地使用鍵和內建的sort()方法。譬如,拿下面的程式碼來說:

  1. import operator

  2. somelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]

  3. somelist.sort(key=operator.itemgetter(0))

  4. somelist

  5. #Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]

  6. somelist.sort(key=operator.itemgetter(1))

  7. somelist

  8. #Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]

  9. somelist.sort(key=operator.itemgetter(2))

  10. somelist

  11. #Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],


在每段例子裡,list都是根據你選擇的用作關鍵引數的索引進行排序的。這個方法不僅對數值型別有效,還同樣適用於字串型別。

竅門三:針對迴圈的優化

每一種程式語言都強調最優化的迴圈方案。當使用Python時,你可以藉助豐富的技巧讓迴圈程式跑得更快。然而,開發者們經常遺忘的一個技巧是:儘量避免在迴圈中訪問變數的屬性。譬如,拿下面的程式碼來說:

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

  2. upper = str.upper

  3. upperlist = []

  4. append = upperlist.append

  5. for word in lowerlist:

  6.    append(upper(word))

  7.    print(upperlist)

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


每次呼叫str.upper, Python都會計算這個式子的值。然而,如果把這個求值賦值給一個變數,那麼求值的結果就能提前知道,Python程式就能執行得更快。

因此,關鍵就是儘可能減小Python在迴圈中的工作量。因為Python解釋執行的特性,在上面的例子中會大大減慢它的速度。

(注意:優化迴圈的方法還有很多,這只是其中之一。比如,很多程式設計師會認為,列表推導式是提高迴圈速度的最佳方法。關鍵在於,優化迴圈方案是提高應用程式執行速度的上佳選擇。)

竅門四:使用較新的Python版本

通常,每個版本的Python都會包含優化內容,使其執行速度優於之前的版本。但是,限制因素在於,你最喜歡的函式庫有沒有同步更新支援新的Python版本。與其爭論函式庫是否應該更新,關鍵在於新的Python版本是否足夠高效來支援這一更新

你要保證自己的程式碼在新版本里還能執行。你需要使用新的函式庫才能體驗新的Python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。只有當你完成必要的修正之後,你才能體會新版本的不同。

然而,如果你只是確保自己的應用在新版本中可以執行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應用在新版本下的表現,並檢查可能出問題的部分,然後優先針對這些部分應用新版本的特性。只有這樣,使用者才能在更新之初就覺察到應用效能的改觀。

竅門五:嘗試多種編碼方法

每次建立應用時都使用同一種編碼方法幾乎無一例外會導致應用的執行效率不盡人意。可以在程式分析時嘗試一些試驗性的辦法。譬如說,在處理字典中的資料項時,你既可以使用安全的方法,先確保資料項已經存在再進行更新,也可以直接對資料項進行更新,把不存在的資料項作為特例分開處理。請看下面第一段程式碼:

  1. n = 16

  2. myDict = {}

  3. for i in range(0, n):

  4.    char = 'abcd'[i%4]

  5.    if char not in myDict:

  6.        myDict[char] = 0

  7.        myDict[char] += 1

  8.        print(myDict)


當一開始myDict為空時,這段程式碼會跑得比較快。然而,通常情況下,myDict填滿了資料,至少填有大部分資料,這時換另一種方法會更有效率。

  1. n = 16

  2. myDict = {}

  3. 相關推薦

    提升Python執行效率竅門

    說起Python,作為一門大熱的程式語言,它簡單易學、語法優美,自身擁有豐富強大的庫,而且應用範圍也是十分廣泛。毫無疑問,Python 確實有用很多的優點,每一個優點看起來都非常吸引人。 但是,Python 並不是沒有缺點的,最主要的缺點之一就是Python 的執行速度不夠快。針對這個問題,下面為大

    "你們不要學pythonpython執行效率慢,去學XX吧"

    當我們終於下定決心想要學習python的時候,身邊的人(學長,同行,所謂的大牛)可能會跟我們這樣講。"你們不要學python,python執行效率慢,去學GoC++C吧",又讓我們好不容易下定的決心又面臨一次猶豫抉擇。事實真的是這樣嗎? 是真的,也不是真的。為什麼這樣說呢?下面慢慢講

    C++、C#、python執行效率對比

    std::chrono::system_clock::time_point start = std::chrono::system_clock::now();     int jj = 0;     for (int i = 0; i < 100000000; i++

    Python竅門(一)—— 提示程式的執行

    1.環境   Win10 x64 + Python2.7.13 x64 2.目的   在控制檯顯示一個程式執行的狀態,向開發者反饋程式執行正常與否。雖然Python的擴充套件模組tqdm可以動態跟蹤程式的執行情況,網上也推薦了很多庫,這裡自定義一個小函式,比較簡單。 3.

    Java效能優化:30個細節,提升Java程式碼執行效率

      程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。   程式碼優化也是一樣,如果專案著眼於儘

    java 效能優化:35 個細節,讓你提升 java 程式碼的執行效率

    前言 程式碼 優化 ,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。 程式碼優化也是一樣,如果專案著眼於儘快無BUG上線,那

    JAVA效能優化:35個細節讓你提升java程式碼的執行效率

    程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題

    五十個技巧提高PHP執行效率(一)

    雙引號 超時 而不是 也會 per 遠程 設置 作用 我們 在項目開發過程中,經常遇到了一些PHP處理程序性能底下的情況,程序運行在centos+nginx環境,雖然這個有很多的原因如:服務器本身配置,運行環境nginx服務,php-fpm配置等等,更多有一點仍然是PHPe

    動手使用ABAP Channel開發一些工具,提升日常工作效率

    sed 上一個 排序 實現 觀測 bsp github 時間 平臺 今天的故事要從ABAP小遊戲說起。 中國的ABAP從業者們手頭或多或少都搜集了一些ABAP小遊戲,比如下面這些。 消滅星星: 掃雷: 來自我的朋友劉夢,公眾號"SAP幹貨鋪"裏的俄羅斯方塊: 用ABA

    Python執行例子

    Python多執行緒小例子 1、在主執行緒中建立子執行緒 下面的程式碼一共建立了三個執行緒:主執行緒、coding 執行緒和music 執行緒,最後使用thread_list 裝載執行緒

    提升Python的程式碼效率的方式

    在準備計算機二級的時候做的總結: 1、應儘量減少函式的巢狀定義,因為函式巢狀定義會導致內部函式反覆定義而影響效率; 2、每個import語句只匯入一個模組,最好按照標準庫、擴充套件庫、自定義庫的順序匯入。如果只用到庫函式的某一個功能,則儘量使用from匯入; 3、選擇合適的資料型別; 4、充分利

    幾個可以提高工作效率Python 內建工具

    在這篇文章裡,我們將會介紹4個Python直譯器自身提供的小工具。這些小工具在筆者的日常工作中經常用到,減少了各種時間的浪費,然而,卻很容易被大家忽略。每當有新來的同事看到我這麼使用時,都忍不住感嘆,原來Python還隱藏了這麼好用的功能。下面就來看一下Python自帶的幾個小工具 一、1秒鐘啟動一個下載伺服

    幾個提高Python工作效率的內建工具,不用是不是太浪費了?

    在這篇文章裡,我們將會介紹4個Python直譯器自身提供的小工具。這些小工具在筆者的日常工作中經常用到,減少了各種時間的浪費,然而,卻很容易被大家忽略。 每當有新來的同事看到我這麼使用時,都忍不住感嘆,原來Python還隱藏了這麼好用的功能。下面就來看一下Python自帶的幾個小工具

    FC 3.5.3提升listview的執行效率

    convertView ViewHolder 在普通的listview中,自定義的adapter裡的getview方法,每次都會將佈局重新載入了一遍,其實沒有必要,使用convertView對載入好的佈局進行快取,以後的進行重用即可。 使用ViewHolder,用於對控制元件

    17個Python竅門你知道多少?

    python中相對不常見卻很實用的小竅門。 空談不如來碼程式碼吧: 交換變數值 給列表元素建立新的分隔符 找列表中出現次數最多的元素 核對兩個字元是否為迴文   反向輸出字串 反向輸出列表 轉置2維陣列 鏈式

    幾個可以提高工作效率Python內建工具

    在這篇文章裡,我們將會介紹4個Python直譯器自身提供的小工具。這些小工具在筆者的日常工作中經常用到,減少了各種時間的浪費,然而,卻很容易被大家忽略。每當有新來的同事看到我這麼使用時,都忍不住感嘆,原來Python還隱藏了這麼好用的功能。下面就來看一下Python自帶的幾個小工具 python學習交流

    17個Python竅門

    python中相對不常見卻很實用的小竅門。 空談不如來碼程式碼吧: 交換變數值 給列表元素建立新的分隔符 找列表中出現次數最多的元素 核對兩個字元是否為迴文   反向輸出字串 反向輸出列表 轉置2維陣列 鏈式

    《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的套路

    現在我們假設要在沒排序的陣列中找一個數: 菜狗也能寫出如下的演算法1: 找到了我就返回位置,否則我就返回-1。 int search1(){ for (int i = 0; i < MAXN; ++i){ if (nums[i] == VALUE){ return i;

    執行效率太低又怎樣? Python 照樣火過 Java、C/ C++

    點選上方“CSDN”,選擇“置頂公眾號” 關鍵時刻,第一時間送達! 世界上有成百上千種程式語言,時代更迭下不斷有新的語言產生和消亡,但 Java 的江湖地位始終無人撼動,長期霸佔排行榜榜首。 但是近年來,Python 顯露出越來越猛的進攻趨勢,更似有反超 Java 之意。 2011 - 201

    提升jsp應用程式執行效率

    方法1:在servlet的init()方法中快取資料   當應用伺服器初始化servlet例項之後,為客戶端請求提供服務之前,它會呼叫這個servlet的init()方法。在一個servlet的生命週期中,init()方法只會被呼叫一次。通過在init()方法中快取一些