9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonでメモリを管理する方法

Last updated at Posted at 2024-03-03

はじめに

Python開発者として、パフォーマンスと効率性は常に私たちの頭の中にあります。
特に、大規模なデータセットや複雑なデータ処理タスクを扱う場合、メモリ使用量の最適化は重要です。
このブログでは、Pythonプログラムのメモリ使用量をプロファイリングし、最適化するための強力なツールであるmemory-profilerについて紹介します。

memory-profilerとは?

memory-profilerは、Pythonプログラムのメモリ使用量を監視し、分析するためのツールです。
関数やコードブロックの実行中にメモリ使用量を追跡し、メモリリークや不必要なメモリ使用を特定することができます。
これにより、パフォーマンスを向上させるための洞察を得ることができます。

インストール

memory-profilerをインストール

pip3 install memory-profiler

機能

  • ラインバイラインのメモリ使用量の分析: 特定の関数内の各行のメモリ使用量を測定します
  • 時間経過によるメモリ使用量の監視: プログラム実行中のメモリ使用量の変化を追跡します
  • コマンドラインインターフェース: プログラムを実行しながらメモリプロファイルを取得するためのコマンドラインツールを提供します
  • 統合開発環境(IDE)との互換性: Jupyter NotebookなどのIDEで直接使用できる機能を提供します

使用方法

memory-profilerを使用するには、プロファイリングしたい関数の直前に@profileデコレータを追加します。
次に、mprof runコマンドを使ってスクリプトを実行し、メモリ使用量のプロファイルを取得します。

サンプルコード

script.py
from memory_profiler import profile

@profile
def sample():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == '__main__':
    sample()

スクリプトを実行すると、次のような出力が得られるはずです。

$ python script.py 
Filename: xxx/script.py

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
     4     21.7 MiB     21.7 MiB           1   @profile
     5                                         def sample():
     6     29.3 MiB      7.6 MiB           1       a = [1] * (10 ** 6)
     7    181.9 MiB    152.6 MiB           1       b = [2] * (2 * 10 ** 7)
     8     29.3 MiB   -152.6 MiB           1       del b
     9     29.3 MiB      0.0 MiB           1       return a

出力に見られるように、使用されているメモリ、後続の文字列作成ごとの増加、および使用済みメモリの一部を解放する文字列削除ステップを確認できます。

このスクリプトを以下のコマンドで実行すると、my_func関数内のメモリ使用量の変化が記録されます。

mprof run script.py

mprof コマンドの実行

上記のように Python スクリプトを実行する代わりに、mprof次のようにコマンドを実行することもできます。

mprof run --python script.py

このコマンドを実行すると、メモリ使用量データを含む.datファイルも表示されるはずです。
mprofコマンドを実行するたびに、タイムスタンプによって識別される.datファイルが1つ作成されます。

メモリ使用量のプロット

場合によっては、数値を見るよりもプロットからメモリ使用量を分析するほうが簡単です。
プロット機能を使用するには matplotlibが必須の依存関係であることを説明したことを思い出してください。

以下のコマンドを使用すると、mprof plot.datファイル内のデータをプロットし、画像ファイル (ここでは、output.png) に保存できます。

mprof plot -o output.png

output.jpg

まとめ

memory-profilerは、Pythonプログラムのメモリ使用量を理解し、最適化するための強力なツールです。このツールを活用することで、より効率的でパフォーマンスの高いコードを書くことができるようになります。メモリ使用量の最適化は、特にリソースが限られている環境や大規模なデータセットを扱う場合に重要です。memory-profilerを使って、コードのメモリ効率を次のレベルに引き上げましょう。


Introduction

As a Python developer, performance and efficiency are always on our minds. Especially when dealing with large datasets or complex data processing tasks, optimizing memory usage becomes crucial. In this blog post, I will introduce memory-profiler, a powerful tool for profiling and optimizing the memory usage of Python programs.

What is memory-profiler?

memory-profiler is a tool for monitoring and analyzing the memory usage of Python programs. It tracks memory usage during the execution of functions or code blocks and helps identify memory leaks or unnecessary memory consumption. This insight allows us to improve the performance of our code.

Installation

You can install memory-profiler by running the following command:

pip3 install memory-profiler

Features

  • Line-by-line memory usage analysis: Measures memory usage for each line in specific functions.
  • Monitoring memory usage over time: Tracks memory usage changes during program execution.
  • Command-line interface: Provides a command-line tool to profile memory while running programs.
  • IDE compatibility: Integrates with IDEs such as Jupyter Notebook.

How to Use

To use memory-profiler, simply add the @profile decorator right before the function you want to profile. Then, run the script using the mprof run command to obtain the memory usage profile.

Sample Code

script.py
from memory_profiler import profile

@profile
def sample():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == '__main__':
    sample()

When you run the script, you should get an output like this:

$ python script.py 
Filename: xxx/script.py

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
     4     21.7 MiB     21.7 MiB           1   @profile
     5                                         def sample():
     6     29.3 MiB      7.6 MiB           1       a = [1] * (10 ** 6)
     7    181.9 MiB    152.6 MiB           1       b = [2] * (2 * 10 ** 7)
     8     29.3 MiB   -152.6 MiB           1       del b
     9     29.3 MiB      0.0 MiB           1       return a

As you can see, the output shows the memory usage, the increase in memory per step, and the memory freed after the deletion of b.

Using mprof Command

Instead of running the Python script, you can also use the mprof command as follows:

mprof run --python script.py

This will generate a .dat file containing the memory usage data. Each time you run the mprof command, it will create a new .dat file identified by a timestamp.

Plotting Memory Usage

In some cases, it might be easier to analyze memory usage through a plot rather than raw numbers. To use the plotting feature, you need to ensure that matplotlib is installed.

You can use the following command to plot the memory usage from the .dat file and save it as an image (in this case, output.png):

mprof plot -o output.png

output.jpg

Conclusion

memory-profiler is a powerful tool to help you understand and optimize the memory usage of your Python programs. By leveraging this tool, you can write more efficient and high-performance code. Optimizing memory usage is particularly important when working in resource-constrained environments or handling large datasets. Start using memory-profiler to take your code's memory efficiency to the next level!

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?