国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

提高 Python 運行效率的六個竅門

huhud / 3296人閱讀

摘要:使用或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。關鍵在于,優化循環方案是提高應用程序運行速度的上佳選擇。此外,關于交叉編譯是否為提高運行效率的最佳方法還存在討論的空間。在使用交叉編譯器時,記得確保它支持你所用的版本。

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

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

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

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

  

Cython

Pylnlne

PyPy

Pyrex

 
這些功能包的用處各有不同。比如說,使用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 = []
append = upperlist.append
for word in lowerlist:
    append(upper(word))
    print(upperlist)
    #Output = ["THIS", "IS", "LOWERCASE"]

每次你調用 str.upper, Python 都會計算這個式子的值。然而,如果你把這個求值賦值給一個變量,那么求值的結果就能提前知道,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,MinGWClang/LLVM

交叉編譯可能造成一些嚴重問題。比如,在使用 Nuitka 時,你會發現即便是一個小程序也會消耗巨大的驅動空間。因為 Nuitka 借助一系列的動態鏈接庫(DDLs)來執行Python 的功能。因此,如果你用的是一個資源很有限的系統,這種方法或許不太可行。

結論

前文所述的六個竅門都能幫助你創建運行更有效率的Python應用。但是銀彈是不存在的。上述的這些竅門不一定每次都能奏效。在特定的Python的版本下,有的竅門或許比其他的表現更好,但這有時候甚至取決于平臺的差異。你需要總結分析你的應用,找到它效率低下的部分,然后嘗試這些竅門,找到解決問題的最佳方法。


本文作者系OneAPM工程師曾靈敏 ,想閱讀更多好的技術文章,請訪問OneAPM官方技術博客。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37541.html

相關文章

  • 在零信任世界中提高AWS安全性六個最佳實踐

    摘要:在零信任世界中,六種提高安全性的最佳做法在亞馬遜網絡服務公司,報告稱,年第三季度的收入為億美元,年前三個財政季度的收入為億美元。在零信任世界中增加對的安全性被盜的特權訪問憑據是當今違規的主要原因。在零信任世界中,六種提高AWS安全性的最佳做法在亞馬遜網絡服務公司(Amazon Web Services,AWS)報告稱,2018年第三季度的收入為66億美元,2018年前三個財政季度的收入為18...

    BenCHou 評論0 收藏0
  • 調研六個開源DevOps平臺

    摘要:項目名稱開發語言活躍度文檔說明功能描述瓦力活躍更新及時文檔較完善,有官網代碼部署平臺空間管理服務器管理項目管理環境管理用戶管理部署管理活躍更新及時文檔較完善,有官網創建主流開發語言的,包括藍鯨智云配置平臺活躍更新及時文檔很完善,有官網,有視 項目名稱 開發語言 活躍度 文檔說明 功能描述 Walle 瓦力 Python 活躍、更新及時 文檔較完善,有官網 DevOps代碼部...

    DevYK 評論0 收藏0
  • 調研六個開源DevOps平臺

    摘要:項目名稱開發語言活躍度文檔說明功能描述瓦力活躍更新及時文檔較完善,有官網代碼部署平臺空間管理服務器管理項目管理環境管理用戶管理部署管理活躍更新及時文檔較完善,有官網創建主流開發語言的,包括藍鯨智云配置平臺活躍更新及時文檔很完善,有官網,有視 項目名稱 開發語言 活躍度 文檔說明 功能描述 Walle 瓦力 Python 活躍、更新及時 文檔較完善,有官網 DevOps代碼部...

    CocoaChina 評論0 收藏0

發表評論

0條評論

huhud

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<