【每天學點技術應用】Python運行效率慢?因為你不知道這六大竅門!

2021-02-21 CPDA數據說


Python是一門優秀的語言,它能讓你在短時間內通過極少量代碼就能完成許多操作。不僅如此,它還輕鬆支持多任務處理,比如多進程。

不喜歡Python的人經常會吐嘈Python運行太慢。但是,事實並非如此。嘗試以下六個竅門,來為你的Python應用提速。

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

Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。這些功能包往往依附於特定的平臺,因此你要根據自己所用的平臺選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接編程才能獲得的運行效率。以下是一些你可以選擇用來提升效率的功能包:

這些功能包的用處各有不同。比如說,使用C語言的數據類型,可以使涉及內存操作的任務更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應用中直接使用C代碼。內聯代碼是獨立編譯的,但是它把所有編譯文件都保存在某處,並能充分利用C語言提供的高效率。

竅門二:在排序時使用鍵

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

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

竅門三:針對循環的優化

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

每次你調用str.upper, Python都會計算這個式子的值。然而,如果你把這個求值賦值給一個變量,那麼求值的結果就能提前知道,Python程序就能運行得更快。因此,關鍵就是儘可能減小Python在循環中的工作量。因為Python解釋執行的特性,在上面的例子中會大大減慢它的速度。

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

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

如果你在網上搜索Python,你會發現數不盡的信息都是關於如何升級Python版本。通常,每個版本的Python都會包含優化內容,使其運行速度優於之前的版本。但是,限制因素在於,你最喜歡的函數庫有沒有同步更新支持新的Python版本。與其爭論函數庫是否應該更新,關鍵在於新的Python版本是否足夠高效來支持這一更新。

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

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

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

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

當一開始myDict為空時,這段代碼會跑得比較快。然而,通常情況下,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的版本下,有的竅門或許比其他的表現更好,但這有時候甚至取決於平臺的差異。你需要總結分析你的應用,找到它效率低下的部分,然後嘗試這些竅門,找到解決問題的最佳方法。

(來源:SOTON數據分析)


相關焦點

  • Python運行效率優於C語言的功能簡介
    Python運行效率優於C語言的功能簡介 在計算機語言中被廣泛的應用Python運行效率,你對Python運行效率相關實際操作有存在不解之處時,一下的文章主要是介紹其相關的實際應用方案。
  • scratch/python/c++,小孩學編程學哪個好?
    由於它是公益軟體,所以官方更新慢,但是也正因為是公益軟體,接口開放,所以有很多組織和個人為其建立了很多擴充,可以用scratch控制多種硬體機器人。市面上的少兒編程培訓機構基本都是scratch編程教育。如果從零開始學習scratch,可以關注本號,本號將發布公益性教程。
  • 這本Python入門暢銷書《「笨辦法」學python 3》,不僅僅是一本書
    關于堅持練習的一點提示你通過本書學習編程時,我正在學習彈吉他。我每天至少訓練2小時,至少花1小時練習音階、和弦、琶音,剩下的時間用來學習音樂理論和樂曲演奏、訓練聽力等。有時我一天會花8小時來學習吉他和音樂,因為我覺得這是一件有趣的事情。對我來說,要學習一樣東西,最自然、最根本的方法就是反覆地練習。
  • 【每天五分鐘】跟著蜜思從零開始學編程(一)
    去Google一下「why python」(程式設計師準則:要Google不要百度。雖然我平時也都用百度來搜八卦新聞,但有關編程的東西真的搜出來結果差很多),你會得到很多結果,諸如應用範圍廣泛、開源、社區活躍、豐富的庫、跨平臺等等等等,也可能找到不少對它的批評,格式死板、效率低、國內用的人很少之類。不過這些優缺點的權衡都是程式設計師們的煩惱。作為一個想要學點編程入門的初學者來說,簡單才是最重要的。
  • 科悟學院講解Python是什麼以及Python的應用
    人工智慧相信現在大多數人都已經不陌生了,逐漸進入千家萬戶,但是知道人工智慧是什麼編寫的嗎?其實人工智慧現在最主要的是利用Python語言去編寫的,有人會問Python是什麼?今天科悟學院的講師就為你介紹一下Python是什麼以及Python的應用,希望對你有所幫助。Python 是一種解釋型、面向對象、動態數據類型的強類型高級程序設計語言。
  • 學python能找到女朋友嗎(python基礎教程)
    編者按:學習python近兩年,談談我對於python的一點小理解,也從一些方面談談自己微薄的想法,本文會介紹如何學習Python。實現一個微型的HTTP服務程序來說是很簡單的事情,在Python下,只需要一個命令行,為了提高大家的編程效率,那就趕快關注本文吧!
  • 搭上python號小火箭,程序運行越來越快!
    但Python運行的慢是歷來被詬病的,一些人黑Python的一點是Python的程序運行速度奇慢。這一方面和語言有關,另一方面可能就是你代碼的問題。其實,無論使用哪種程式語言,特定程序的運行速度很大程度上都取決於該程序的開發人員及其編寫快而優的程序的技巧和能力。語言方面的問題我們解決不了,所以只能在編程技巧上來提高程序的運行效率。
  • 如何用iPad運行Python代碼?
    來到現場,一看需要 Python 3.6 版本,你就又安裝了一份新的。結果執行起來,你根本分不清運行的 Python, pip 命令來自哪一個套件,更搞不清楚軟體包究竟安裝到哪裡去了。再加上虛擬環境配置,你就要抓狂了。還有的,甚至是網絡擁塞問題。因為有時需要現場安裝調用體積龐大的軟體包,幾十臺電腦「預備——齊」一起爭搶有限的Wifi帶寬,後果可想而知。
  • 學Python很久都學不會,技術大牛教你打開它的正確方式
    學Python已成為當下年輕人讀懂計算機加快工作效率的一種方式,但是最終取得真經的人少之又少。Python到底可以幫助你實現什麼樣的操作應用?今天讓我們看看開課吧的優秀學員威小明是如何在學業中使用Python爬取數據的。
  • 為什麼學Python?一文看懂Python主要應用領域和就業前景
    因為Python程式設計師太少啦!很多高校並未開設Python課程,因此市場上Python開發人才供小於求。很多企業為了爭奪有限的Python程式設計師,不得不給出極其豐厚的薪資待遇,現在初級Python開發工程師的起薪一般在10-20K!雖然「缺口大,出口少」,人才供需矛盾尖銳,Python程式設計師可謂是炙手可熱,但作為小白完全零基礎的你會不會有疑惑?我能學會麼?
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。3、應用:Python是一種通用程式語言,多範式的,支持面向對象編程、程序編程以及函數編程;C是結構化程式語言,允許使用函數、選擇、迭代,主要用於硬體相關的應用程式。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    他們的區別在於perf_counter返回的絕對值,包括你的Python程序進程未運行時的時間,因此它可能會受到計算機負載的影響。另一方面,process_time僅返回用戶時間(不包括系統時間),這僅是你的過程時間。加速吧!讓Python程序運行得更快,這部分會很有趣!
  • 讓Python代碼更快運行的 5 種方法
    文章出處: IT168 翻譯,點擊文章底部「閱讀原文」查看更多精彩技術、資訊內容不論什麼語言,我們都需要注意性能優化問題,提高執行效率。選擇了腳本語言就要忍受其速度,這句話在某種程度上說明了Python作為腳本語言的不足之處,那就是執行效率和性能不夠亮。儘管Python從未如C和Java一般快速,但是不少Python項目都處於開發語言領先位置。Python很簡單易用,但大多數人使用Python都知道在處理密集型cpu工作時,它的數量級依然低於C、Java和JavaScript。
  • Python和Java語言,新手應該先學哪個
    至於python語言,現在火得不行,全宇宙都知道的程式語言,吸引了不少人的眼球,各大培訓機構的標語都是大數據+python+人工智慧了,這些趁熱點的標語你看看就行了,別當真,當真你就輸了。python是個腳本語言,極其靈活,極其好學,既然這麼好,為啥不學呢?其實在編程界裡,語言的靈活,其潛臺詞就是失控。
  • 你的iPhone運行變慢了嗎?6個提高蘋果手機運行速度的方法
    但是,隨著使用時間的延長和手機年齡的增長,我們的iPhone會減速,讓我們對性能不佳感到沮喪。你的手機運行速度不如以前快有很多原因。當處理器、數據機和存儲模塊在物理上老化並開始惡化時,就會發生衰減,這會降低它們的性能。然而,如果你在過去幾年內購買了你的蘋果設備,那麼比特率下降的可能性是微乎其微的,因為這個設備還是相對較新的。
  • python基礎教程之python是什麼?
    如果你聽說過TIOBE排行榜,你就能知道程式語言的大致流行程度。這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。C語言是可以用來編寫作業系統的貼近硬體的語言,所以,C語言適合開發那些追求運行速度、充分發揮硬體性能的程序。
  • 0基礎入門Python學習步驟如何安排?
    所以既然你決定了要學習python,那麼就需要先下一個決心,至少決定要做為自己的主力語言。 python是全能語言,社區龐大,有太多的庫和框架。你只需要找到合適的工具來實現想法,省去了造輪子的精力。 coder可以寫儘可能少的代碼來實現同等的功能。「人生苦短,我用python」是至理名言。
  • @Python 程式設計師,如何最大化提升編碼效率?
    作者 | Enoch CK譯者 | 劉暢整理 | Jane出品 | Python大本營【導語】無論你是一位高級的AI工程師還是學生,你都會在工作或學習過程中需要用到 Python。自 1991 年首次發布後,Python 很快就成為了程式設計師和技術人員最喜歡的語言。
  • python是什麼,python能幹什麼,為什麼大家都學pyhon一起來看看吧
    相信大家如果經常上網,就會看到各種學python的教程,那麼python究竟是什麼意思,學會了可以用來幹什麼那,我們一起來看一下吧。首先大家要明白python是一種跨平臺的程式語言,python編程的特點易讀、易維護,所以被大量的用戶所歡迎,python最大的特點是開發速度快,因為編程開發效率一直很低,python有很多第三方庫,所以開發起來事半功倍,很流行的一句話,人生苦短,我學python,可謂是把python特點完整的詮釋出來。
  • 讓 Python 代碼運行更快的最佳方式!
    這些優點使其在各種各樣的應用程式、工作流程和領域中得到了廣泛應用。但是就語言的設計,也就是它天然的解釋能力還有它的運行時的動態性而言,Python總是比C或C ++這樣的機器本地語言慢一個數量級。多年來,開發人員已經為Python的速度限制提出了各種變通方法。例如你可以在C中編寫性能密集型任務並使用Python封裝它,許多機器學習庫正是這樣做的。