検索
ホームページバックエンド開発Python チュートリアルPython のガベージ コレクション メカニズムにおける参照カウントとは何ですか

この記事では、Python に関する関連知識を提供します。主に、ガベージ コレクション メカニズムにおける参照カウントの関連内容を紹介します。Python でオブジェクトへのポインターがある場合、ポインターは、オブジェクトです。見てみましょう。皆さんのお役に立てれば幸いです。

Python のガベージ コレクション メカニズムにおける参照カウントとは何ですか

[関連する推奨事項: Python3 ビデオ チュートリアル ]

Python の __del__ マジック メソッドは、オブジェクトの終了とも呼ばれます。または、オブジェクトがメモリから削除される直前に呼び出されるメソッドです。実際にはメモリからオブジェクトを削除する仕事はしません。それがどのように起こるかは後で説明します。代わりに、このメソッドは、オブジェクトが削除される前に必要なクリーンアップを実行するために使用されます。たとえば、オブジェクトの作成時に開いていたファイルをすべて閉じます。

このセクションでは、例として次のクラスを使用します。

class MyNameClass:
    def __init__(self, name):
        self.name = name
    
    def __del__(self):
        print(f"Deleting {self.name}!")

上記の例では、初期化時に入力として名前を受け入れるクラスを定義しており、ファイナライザーが呼び出されると、関連するインスタンスの名前を出力して通知します。こうすることで、どのオブジェクトがいつメモリから削除されたかを知ることができます。

それでは、CPython はいつメモリからオブジェクトを削除することを決定するのでしょうか?これを行う方法は 2 つあります (CPython 3.10 時点では)。参照カウントとガベージ コレクションです。

参照カウント

Python でオブジェクトへのポインターがある場合、それはそのオブジェクトへの参照です。特定のオブジェクト a について、CPython は、 a を指す他のものがいくつあるかを追跡します。このカウンタがゼロに達した場合、他にオブジェクトが使用されていないため、オブジェクトをメモリから安全に削除できます。例を見てみましょう。

>>> Harward = MyNameClass("Harward")
>>> del Harward
Deleting Harward!
>>>

ここでは、新しいオブジェクト (MyNamedClass("Harward")) を作成し、それへのポインター (Harward =) を作成します。次に、Harwade を削除すると、この参照も削除され、MyNamedClass インスタンスの参照カウントは 0 になります。したがって、CPython はメモリからそれを削除することを決定します。そして、その直前に、その __del__ メソッドが呼び出され、上で見たメッセージが出力されます。

オブジェクトに対して複数の参照を作成した場合、オブジェクトを削除するにはすべての参照を削除する必要があります。

>>> bob = MyNameClass("Bob")
>>> bob_two = bob # creating a new pointer to the same object
>>> del bob # this doesn't cause the object to be removed...
>>> del bob_two # ... but this does
Deleting Bob!

もちろん、MyNamedClass インスタンス自体にポインターを含めることができます。結局のところ、これらは任意の Python オブジェクトであり、任意のプロパティを追加できます。例を見てみましょう。

>>> jane = MyNamedClass("Jane")
>>> bob = MyNamedClass("Bob")
>>> jane.friend = bob # now the "Jane" object contains a pointer to the "Bob" object...
>>> bob.friend = jane

上記のコード スニペットで行ったことは、いくつかの循環参照を設定することです。 Jane という名前のオブジェクトには Bob という名前のオブジェクトへのポインタが含まれており、その逆も同様です。次のことを行うと、事態は面白くなります。

>>> del jane
>>> del bob

これで、名前空間からオブジェクトへのポインターが削除されました。現在、これらの MyNameClass オブジェクトにはまったくアクセスできませんが、それらが削除されようとしていることを示す印刷メッセージは表示されません。これは、これらのオブジェクトが相互に含まれる参照をまだ持っているため、その参照カウントが 0 ではないためです。

ここで作成するのはループ分離です。この構造では、各オブジェクトはループ内に少なくとも 1 つの参照を持ち、それを存続させますが、ループ内のすべてのオブジェクトをアクセスした名前空間から削除することはできません。

ループ分離の直感的なパフォーマンス

ループ分離を作成したときの直感的なパフォーマンスを次に示します。

まず、2 つのオブジェクトを作成します。各オブジェクトには名前空間内に名前があります。

Python のガベージ コレクション メカニズムにおける参照カウントとは何ですか

次に、各オブジェクトにポインターを追加して 2 つのオブジェクトを接続します。

Python のガベージ コレクション メカニズムにおける参照カウントとは何ですか

#最後に、両方のオブジェクトの元の名前を削除して、名前空間からポインターを削除します。この時点では、2 つのオブジェクトには名前空間からアクセスできませんが、各オブジェクトにはもう一方のオブジェクトへのポインターが含まれているため、それらの参照カウントはゼロではありません。

Python のガベージ コレクション メカニズムにおける参照カウントとは何ですか

したがって、ランタイムの作業メモリから無駄なリサイクル不可能なオブジェクトを排除するには、参照カウントだけでは不十分であることは明らかです。ここで CPython のガベージ コレクターが登場します。

【関連する推奨事項: Python3 ビデオ チュートリアル ]

以上がPython のガベージ コレクション メカニズムにおける参照カウントとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は掘金で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター