victor是資深的python黑客,許多python模組的核心貢獻者和作者。他最近撰寫了pep 454(其中提出了乙個新的tracemalloc
模組,用於在python中跟蹤記憶體塊的分配,並寫了乙個簡單的ast優化器。
優化python**的乙個初步策略是什麼?
針對python的策略其實和在其他語言中一樣。首先需要定義良好的用例,以得到乙個穩定可重現的基準。沒有可靠基準的情況下嘗試不同的優化方法很可能導致時間的浪費和不成熟的優化。無用的優化可能使**更糟,更不易懂,甚至更慢。有用的優化必須至少讓程式加速5%。
如果發現**的某個部分比較「慢」,那麼需要針對這段**設計乙個基準測試。對於較短的函式的基準測試通常稱為「微基準測試」。通過微基準測試衡量優化效果時,速度提公升應該至少達到20%或者25%。
在不同的計算機、不同的作業系統甚至不同的編譯器上執行同乙個基準測試會很有意思。例如,函式realloc()
的效能在linux和windows上是不同的。有時候針對不同的平台的**實現也可能會不同,儘管這是應該盡量避免的。
關於python**的效能分析和優化有許多不同的工具,你最喜歡的是哪個?
python 3.3提供了乙個新的time.perf_counter()
函式,用來為基準測試衡量已耗用時間。它是最好的解決方案。
測試應該執行不止一次,最少3次,5次基本夠了。重複測試可以填充磁碟快取和cpu快取。我傾向於保證最小時間,其他一些開發人員則傾向於使用幾何平均值。
對於微基準測試,timeit
模組簡單易用且能很快得到結果,但使用預設的引數結果並不穩定。應該手工重複測試,以得到穩定的結果。
優化是非常花時間的,所以最好能專注那些耗費最多cpu的函式。為了找到這些函式,python提供了cprofile
和用來記錄每個函式時間消耗的profile
模組。
能夠改進效能的最有意思的python技巧是什麼?
應該盡可能重用標準庫。它們經過良好的測試並且通常都很高效。python內建的型別都是用c實現的,所以效能都很好。應使用正確的容器以得到最佳的效能,python提供許多不同的容器,如dict
、list
、deque
、set
等。
也有一些用來優化python的非常手段,但是應該避免使用它們,因為這一點點的速度提公升會喪失**的可讀性。
python之禪(pep 20)說:「應該有一種—最好只有一種—顯而易見的方式去實現。」實際上,寫python**有很多不同的方式,且效能各異,所以只能信賴針對特定用例的基準測試。
在哪些領域中python的效能很差?哪些領域中應該小心使用?
通常,在開發新的應用程式時我不太擔心效能問題。不成熟的優化是所有問題之源。當找到了緩慢的函式時,應該修改演算法。如果演算法和容器都是經過仔細挑選的,那麼可以考慮用c語言重寫短函式以獲得更好的效能。
cpython的乙個眾所周知的效能瓶頸是全域性直譯器鎖(global interpreter lock,gil)。兩個執行緒不能在同時執行python位元組碼。然而,這個限制只在兩個執行緒執行純python**時有影響。如果大多數處理時間花在函式呼叫上,並且這些函式釋放了gil,那麼gil並非效能瓶頸。例如,大多數i/o函式都會釋放gil。
multiprocessing
模組可以很容易地用來繞過gil。另乙個稍微複雜的方式是編寫非同步**。twisted、tornado和tulip都是利用了這一技術的面向網路的庫。
你見過最多的導致效能差的「錯誤」是什麼?
沒有很好地理解python就可能寫出效率低的**。例如,我見過在不需要複製時錯誤地使用了copy.deepcopy()
。
另乙個效能殺手是低效的資料結構。少於100個元素的情況下,容器型別對效能沒有影響。對於更多元素的場景,應該了解每個操作(add
、get
、delete
)的複雜性和影響。
本文摘自《python高手之路》
從《python高手之路》中讀者將學到什麼
● 最佳實踐:書中給出了構建應用程式時可參考的方法和建議,幫助讀者充分利用python的特性,構建不會過時的應用程式。如果讀者正在做一些東西,可以立刻應用本書中提及的技術去改進自己當前的工作。
● 解決問題:書中介紹了測試、移植、擴充套件python應用程式和庫等方面的實際問題並提供了相應的解決方案,還介紹了一些非常好的小技巧,討論了一些長期維護軟體的策略。
● 語言的內部機制:書中闡述了python語言的一些內部機制,幫助讀者更好地理解如何開發更高效的**,並獲得對這門語言內部工作原理更深刻的洞察力。
● 專家訪談錄:書中包含多篇對不同領域專家的訪談,讓讀者可以從開源社群和python社群的知名黑客那裡獲得意見、建議和技巧。
本書英文原版配套**是
黑客類庫 與 python模組
python 必須會使用類庫 name mechansoup 定位是功能性的網頁抓取和互動庫。它最大的特點是可以和網頁互動,填充一些表單。mechansoup 定位是功能性的網頁抓取和互動庫。它最大的特點是可以和網頁互動,填充一些表單。beautifulsoup 最主要的功能是從網頁抓取資料。req...
新手Python黑客工具入門
為了滿足新手對python的追求,特寫了三個初級python入門工具。第一期寫了三個初級工具,希望新手看完以後可以對python的指令碼有乙個基本了解。高手請繞過此文章!一件套 pythond requests模組構造乙個whois資訊收集器 二件套 python編寫乙個arp斷網攻擊 三件套 目錄...
Python黑客攻防(九)編寫後門程式
本篇文章講解如何編寫後門程式,並實踐測試執行,通過後門程式查詢檔案。防火牆用於攔截使用者從外部訪問伺服器。訪問伺服器的telnet ftp等服務只限允許的使用者使用。防火牆並不會阻斷使用者從內部向外部的訪問路徑。雖然很難從外部侵入防火牆,但一旦成功,黑客就能輕鬆竊取敏感資訊。後門技術用於繞過防火牆等...