🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

12023閲覧

pythonでメモリを解放する必要はありますか。

masuter0413

総合スコア50

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/11/03 02:32

プログラミング初心者です。
例えば,C言語などで動的にメモリを確保した場合はfreeしないとどんどんメモリが食われていくという話を先生に聞きました。
pythonでは動的,または普通に変数を宣言したときはこのような処理は必要でしょうか。
環境はjupyter notebook です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まず前提として、変数の作成それ自体はメモリ領域を消費しません。
(厳密には若干異なりますが、単純化して言うとそうです)

python

1a = [1, 2, "hoge"] # [1, 2, "hoge"]の分だけメモリを消費する 2b = a # これは新たなメモリ消費を生じない。bはaが参照しているのと同じものを参照

Cでいう、mallocして値を初期化して……という処理が[1, 2, "hoge"]と書くことで一気に行われて(listなので各要素がそれぞれ生成されてから外側のlistが生成されますが)、そのアドレスが変数aと関連付けられるとみなしてとりあえずは構いません。
(実際は変数はCでいうポインタ型変数ではなく、シンボルテーブルのハッシュテーブルのキーになる文字列)


Pythonでは動的メモリ確保は行われますが、freeを明示的に行う必要はありません。ガベージコレクタというものが言語処理系の機能として実装されています。

どういうことかというと、以下のような例がわかりやすいでしょうか。

python

1a = "fuga" # "fuga"が生成されてaに代入される 2a = "piyo" # aに"piyo"を代入すると"fuga"にアクセスする手段はなくなる

二行目の時点で"fuga"は自動的にメモリ上から除去されます。これは他の値を代入することで副次的に起きる現象ですが、del文を使ってもう少し明示的に書くこともできます。

python

1a = "fuga" 2del a # aという変数は使えなくなる

del文はこの場合オブジェクトを消すのではなく、変数を消すだけだということに注意してください。

python

1a = "fuga" 2b = a 3del a 4# aにはアクセスできないがbにはできるし、"fuga"もメモリ上に残る

端的に言うと、プログラムからアクセスする手段がなくなった(変数やオブジェクトの属性、コンテナの中身などからたどり着けなくなった)オブジェクトは消えます。不要なものは消してくれる訳です。


逆に言うと、プログラムからアクセスする手段が残っていればオブジェクトは未来永劫残り続けます。C言語などでいうメモリリークとは異なる現象ですが、これが原因で結果的にメモリが足りなくなる可能性は皆無ではありません(普通に書いて使う分には気にしなくて良いですが)。

投稿2019/11/03 03:51

編集2019/11/03 08:01
hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

pythonでは動的,または普通に変数を宣言したときはこのような処理は必要でしょうか。

Pythonにはガベージコレクションが組み込まれていますので、使わなくなった変数は放置していても参照不能となった時点で自動でメモリが開放されます。手動操作は不要です。

投稿2019/11/03 03:23

maisumakun

総合スコア145967

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考情報

  • 【Python入門】メモリの解放や効率的に使う方法をマスターしよう!

https://www.sejuku.net/blog/74447

...
PythonにはGC(ガベージコレクション)の機能があるため、メモリ開放はC言語などのように手動で実施することなく、大抵はGCが自動で行ってくれます。そのため普段はメモリについて大きく意識することなくプログラミングの処理を書くことに専念できるのです!

しかし大量のデータを扱う場合やメモリ制限のある環境では、GCの判断で開放を行うのではなく、必要なくなったタイミングで即座に開放したい場合も出てきます。
...

コンピュータの資源には、メモリー以外に、ファイルもあります。
ファイルを rews/wrie するために ファイルを open します。
ファイルの close は python でも、自動では行ってくれません。
したがって、 file を open して close をし忘れているという処理をループさせていたりすると、途中でエラーになってしまいます。

投稿2019/11/03 04:53

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問