Python代碼的性能優化:測試內存消耗
Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
在這篇文章中,我會介紹一些能在Python中幫助我們解決痛苦問題的工具,特別是當我們使用PyPy時的內存消耗問題。
為什麼我們第一個關心這個問題呢?為什麼我們不僅僅關心性能?這些問題的答案非常複雜,但我會總結出來。
PyPy是一個可選的Python解釋器,它具有比CPython更大的優勢:速度(通過它的JIT編譯器),兼容性(幾乎可以替代CPyton)和並發性(使用stackless和greenlets)。
PyPy有一個缺點,由於它的JIT和垃圾一樣的回收站實現,所以它通常會比CPython使用更多的內存。然而在某些情況下,它能夠比CPython消耗更少的內存。
接下來我們來看看如何測量你的程序使用了多少內存。
診斷內存的使用情況
memory_profiler
這是一個可以用於測量解釋器運行一個負載時使用的內存量的庫,名稱為memory_profiler。它可以通過pip安裝:
並且需要安裝psutil依賴包:
這個工具的優點是會在Python腳本中一行行的顯示內存的消耗。這有助於我們從腳本中找到可以重寫的地方,但這種分析帶來了一個缺點。你的代碼將比一般的腳本運行慢10到20倍。
怎麼使用它呢?你只需要將@profile添加到你需要測試的函數中就可以了。
讓我們看看它的運行吧!我們將使用我們之前文章中的素材腳本作為模型,稍微修改以刪除統計部分。它可以在GitHub上查看。
https://github.com/apatrascu/hunting-python-performance/blob/master/02.primes-v1.py
開始測試,需要使用以下PyPy命令:
或者更簡短,通過直接在腳本中導入memory_profiler:
執行這一行代碼之後,我們將看到PyPy得到如下的結果:
我們可以看到這個腳本使用了24.371094MiB的RAM。讓我們分析一下,我們看到其中大多數是在構建數組時使用,這個數組排除了偶數,保存了所有其他的數值。
我們可以通過調用range函數來改善這一點,其使用一個增量參數。
如果再次測試,我們會看到如下結果:
不錯,現在我們的內存消耗降到了22.75MiB。消耗可以通過使用列表解析(list comprehension)再次降低。
再次測試:
我們腳本的最終版本僅消耗了22.451875MiB。這幾乎比第一個版本減少了10%。
英文原文:https://pythonfiles.wordpress.com/2017/05/18/hunting-python-performance-part-2/
譯者:南北丶
※在公司工作兩年以上的員工少賺一半的薪水
※月考+Python在嵌入式系統中的崛起
※用Python分析購物籃
※榨乾 Python 代碼的性能——第一部分之環境設置
※在Python中自定義類的創建方式
TAG:Python部落 |
※使用 BenchmarkDotnet 測試代碼性能
※性能測試loadrunner使用共性問題匯總
※Olinya能量占卜小測試
※性能測試loadrunner場景問題之HTTP
※Python只適合測試?
※Python錯誤、調試和測試
※Facebook 測試Downvote負評功能,將進行小範圍內測
※如何用 Python 測試 Android 應用
※Raspberry Pi3 B+具有更快的CPU、Wi-Fi和更容易的兼容性測試
※python下的測試利器pytest
※教你在Python中用Scikit生成測試數據集
※蘋果HomePod智能音箱測試:回答準確率遜於Google Home
※花粉怒懟果粉:Mate 10 Pro和iPhone X挑戰低溫測試
※Intel漏洞門性能影響深度測試:果然優化了過於流暢的Bug
※Ansible Tower的安裝與基本功能測試
※為何大量設計師用蘋果專屬ppt軟體Keynote做原型測試?
※Crytek的多人射擊遊戲Hunt:Showdown關閉alpha測試
※微軟正在iOS和Android上的Outlook中測試Cortana
※整理-LinuxVPS 路由以及性能測試
※測試精品 Suunto Spartan Sport Wrist HR Baro