Archives of learned topics

Pythonでのメモリ使用状況をリアルタイムで表示(初級)

Pythonプログラムのメモリ使用方法(初級)をurseraの講座で解説していたので、メモしておく。

使用サイト

Python Tutor - Visualize Python, Java, JavaScript, TypeScript, Ruby, C, and C++ code execution -> リアルタイムでメモリの使用状況が分かるサイト

使用スクリプト

def convert_to_minutes(num_hours):
    '''(int) -> int
    Reteurn the number of minutes there are in number
    >>> convert_to_minutes(2)
    120
    '''
    
    result = num_hours * 60
    return result
    
minutes_2 = convert_to_minutes(2)
minutes_3 = convert_to_minutes(3)

講座ので使用していたスクリプトと全く同じです。

実行してみる。

起動

f:id:jsakusan:20170311111451p:plain Frame -> stack領域の状況を示しています。現在は、convert_to_minutes(2)のみがスタックされています(Global Frame)。
Object -> heap領域の状況。Function:convert_to_minutesのソース情報、引数情報などが格納されています。
※FrameとObjectはid(番地)によって関連づけられています。

関数の計算

f:id:jsakusan:20170311112521p:plain num_hours、result、return valueが変数としてスタック領域に用意さる(Local Frame)。 この時それぞれの数値本体は、heap領域に存在します。変数のみがstackにあるイメージです。

数値が返る

f:id:jsakusan:20170311112829p:plain convert_to_minutes(2)の計算が終了したことで、Local Frameが解放され、返り値のみがminutes_2に渡される。 この時、数値本体はheap領域にある。

まとめ

・stack領域は変数を用意する場所。呼び出し順を保持している。(Stackなので当たり前) ・それに対して、数値自体はheap領域に存在する。 ・stack領域の変数とheap領域の数値は別途idで結び付けられている。

これまでよく理解できていなかった、アプリ実行中にメモリの利用方法が少しわかった。