Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのガベージコレクション


Pythonのメモリ管理は簡単です。メモリの割り当てと割り当て解除は自動的に行われるため、メモリ管理について心配する必要はありません。メモリ管理のメカニズムの1つは、ガベージコレクションです。ガベージコレクションのさまざまな側面を理解しましょう

ガベージコレクション

これは、共有コンピュータのメモリがクリーンアップされるプロセスであり、実行中のプログラムがそのメモリを必要としなくなったときに、そのプログラムによって現在使用されています。ガベージコレクションを使用すると、解放されたメモリを別のプログラムで使用できます。

pythonがメモリ管理に使用する方法は2つあります-

  • 参照カウント
  • ガベージコレクション

Pythonのガベージコレクションは自動ですが、一部のプログラミング言語では、オブジェクトを自分でクリーンアップする必要があります。 Pythonでは、必要に応じてオブジェクトを手動で削除できます。

>>> x = 9
>>> print(x)
9
>>> del x
>>> print(x)
Traceback (most recent call last):
   File "<pyshell#3>", line 1, in <module>
      print(x)
NameError: name 'x' is not defined

上記では、1つの変数(x)を定義して使用しています。実行時に、オブジェクトを削除し(Pythonのすべてがオブジェクトであるため)、出力を試みます。

上記のプログラムの最初の2行では、オブジェクトxがわかっています。ただし、object(x)を削除すると、印刷できなくなります。

したがって、上から見ると、ガベージコレクションは完全に自動化されており、心配する必要はありません。上記の概念を別の例で理解しましょう。上記のコードのようにPythonのすべてのオブジェクトには、参照カウントと型へのポインターがあります。

参照カウントの変更値は、使用方法によって異なります。たとえば、オブジェクトxを別のオブジェクトyに割り当てると、その参照カウントは2に増加します。

>>> some_list = [1, 2 ,3, 4, 5, 6, 7, 8, 9]
>>> #Reference count of some_list = 1
>>> other_list = some_list
>>> #Reference count = 2
>>> #This will also increases if we pass the object as an assignment
>>> list_total = sum(some_list)
>>> # If we put the object in a list, reference count will also increase
>>> list_of_list = [some_list, some_list, some_list]
>>>
>>> #Let's check the reference count of object "some_list"
>>> import sys
>>> sys.getrefcount(some_list)
6
の参照カウントを確認しましょう

上記は、Pythonでのメモリ管理の参照カウントを理解するための良い例の1つです。 1つのオブジェクト「some_list」(参照カウント=1)を作成し、それを別のオブジェクトに割り当て(参照カウント=2)、オブジェクトを引数として設定し(参照カウント=3)、後でオブジェクトをオブジェクトの出現が3回であるリスト(参照カウント=6)。後でオブジェクト「some_list」の参照カウントを取得しようとすると、6が取得されます。

>>> import sys
>>> sys.getrefcount(some_list)
6
>>>
>>> del list_of_list
>>> sys.getrefcount(some_list)
3
>>> del some_list
>>> sys.getrefcount(some_list)
Traceback (most recent call last):
   File "<pyshell#17>", line 1, in <module>
      sys.getrefcount(some_list)
NameError: name 'some_list' is not defined

  1. Pythonオブジェクトの比較「is」と「==」

    この記事では、オブジェクトの比較について学習します。つまり、演算子と等式演算子の間です。 等式演算子は渡された引数の値を処理しますが、is演算子は引数として渡された2つのオブジェクトの参照を比較します。 等しい場合、引数の演算子の内容はそれらの参照を無視して比較されます。つまり、異なる場所に格納されている同じコンテンツは同一であると見なされますが、演算子の参照を使用する場合は最優先事項です。 次に、以下の実装の概念を観察しましょう- 例 list_1 = ['t','u','t','o','r'] list_

  2. PythonのTimeTupleとは何ですか?

    datetime.dateインスタンスのtimetuple()メソッドは、time.struct_time型のオブジェクトを返します。 struct_timeは名前付きタプルオブジェクトです(名前付きタプルオブジェクトには、インデックスまたは名前でアクセスできる属性があります)。 struct_timeオブジェクトには、日付フィールドと時刻フィールドの両方を表す属性と、夏時間がアクティブかどうかを示すフラグがあります。 timetuple()関数によって返される名前付きタプルでは、​​日付オブジェクトに従って年、月、日のフィールドが設定され、時間、分、秒に対応するフィールドはゼロに設定され