performance memory - 推薦使用哪種Python內存分析器?




profiler usage (8)

我想知道我的Python應用程序的內存使用情況,特別想知道哪些代碼塊/部分或對象消耗了大部分內存。 谷歌搜索顯示,商業版本是Python Memory Validator (僅限Windows)。

而開源的是PySizerHeapy

我沒有嘗試任何人,所以我想知道哪一個是最好的考慮:

  1. 給出大部分細節。

  2. 我必須對我的代碼做最少或不做更改。


Answers

試試pytracemalloc項目 ,它提供了每個Python行號的內存使用情況。

編輯(2014/04):它現在有一個Qt GUI來分析快照。


我建議Dowser 。 這是非常簡單的設置,你需要零代碼更改。 您可以通過簡單的Web界面查看每種類型對象的計數,查看活動對象列表,查看對活動對象的引用。

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

您導入memdebug,並調用memdebug.start。 就這樣。

我還沒有試過PySizer或Heapy。 我會很感激別人的評論。

UPDATE

以上代碼適用於CherryPy 2.XCherryPy 3.Xserver.quickstart方法已被刪除,並且engine.start不採用blocking標誌。 所以,如果你使用CherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

考慮一下objgraph庫(有關示例用例,請參閱 )。


由於沒有人提到它,我將指向我的模塊memory_profiler ,它能夠memory_profiler打印內存使用情況報告,並在Unix和Windows上工作(需要在最後一頁上使用psutil)。 輸出不是非常詳細,但目標是讓您了解代碼消耗更多內存的位置,而不是對分配的對象進行詳盡的分析。

在使用@profile裝飾你的函數並使用-m memory_profiler標誌運行你的代碼之後,它將打印一行一行的報告,如下所示:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

我正在為Python開發一個名為memprof的內存分析器:

http://jmdana.github.io/memprof/

它允許您在裝飾方法的執行過程中記錄和繪製變量的內存使用情況。 您只需使用以下命令導入庫:

from memprof import memprof

並使用以下方法來裝飾你的方法

@memprof

這是關於情節如何的例子:

該項目在GitHub中託管:

https://github.com/jmdana/memprof


Muppy是另一個Python內存使用情況分析器。 該工具集的重點在於識別內存洩漏。

Muppy試圖幫助開發人員識別Python應用程序的內存洩漏。 它可以在運行時跟踪內存使用情況,並識別洩漏的對象。 此外,還提供了一些工具,可以找到未發布對象的來源。


我發現meliae比Heapy或PySizer功能更強大。 如果你碰巧正在運行一個wsgi web應用程序,那麼Dozer就是一個很好的Dowser中間件包裝器


三元運算符在不同的編程語言中

在這裡,我只是嘗試在幾種編程語言之間展示ternary operator一些重要區別。

Javascript中的三元運算符

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Ruby中的三元運算符

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Scala中的三元運算符

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

R編程中的三元運算符

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Python中的三元運算符

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

現在你可以看到蟒蛇語言的美麗。 它具有高度可讀性和可維護性。





python performance memory-management profiling