ガベージコレクターはすべてのPythonオブジェクトを追跡できるのか?
Pythonの2つのメモリ管理手法
Pythonでは、不要になったオブジェクト(ガベージ)を回収するために、主に2つの仕組みが使われています。
1つ目は参照カウントです。これはすべてのオブジェクトに適用されますが、互いを直接・間接的に参照し合う「循環参照」を持つオブジェクト群は解放できません。そこで登場するのが、いわゆるガベージコレクターです。Pythonにはgcモジュールが用意されており、追跡対象のオブジェクトの中から循環参照を検出して回収します。ただし、循環参照の一部になり得るオブジェクトだけがこのサイクリックGCの対象となります。たとえばリストは対象ですが、文字列は他のオブジェクトを一切参照しないため対象外です。
GCによる追跡の対象になるのはどのオブジェクト?
Pythonで定義されたすべてのクラスとそのインスタンスは、自動的にサイクリックGCの追跡対象になります。一方、C言語で定義された型は、開発者が明示的に対応を実装しない限り追跡されません。標準の組み込み型のうち、循環参照に関わり得るものはすべて追跡対象となっています。つまり、gcモジュールが把握しているのは「GCに協力してくれる型」だけだということです。
obmalloc:Python独自のメモリアロケータ
さらに、Pythonには独自の集約型メモリアロケータ(obmalloc)があります。これは大きなメモリ領域(アリーナ)をまとめて確保し、生成される小さなオブジェクトの大部分にそのメモリを割り当てます。現在のPythonでは、アリーナが完全に空になれば解放されるようになりました(以前は長らく解放されませんでした)。しかし実際には、アリーナを空にする機会はかなり少ないのが実情です。Pythonのオブジェクトはメモリ上で移動できないため、最後に残った少数のオブジェクトを別のアリーナへ押し込むような最適化が行えないからです。
-
【Python・Pandas】インデックスがIntervalオブジェクトを保持しているか確認する方法
PandasのインデックスがInterval(区間)オブジェクトを保持しているかどうかを確認するには、index.is_interval()メソッドを使用します。このメソッドは、インデックスのすべての値がIntervalオブジェクトである場合にTrueを返し、そうでない場合はFalseを返します。 必要なライブラリのインポート まず、必要なライブラリをインポートします。 import pandas as pd Intervalオブジェクトの作成 pd.Interval()を使って、Intervalオブジェクトを作成します。第1引数に左端の値、第2引数に右端の値を指定します(デフォルトでは右側が
-
Wi-Fiが世界中であなたを追跡する仕組み――接続しなくても漏れる個人情報
私たちの多くは、どこにいても近くにWi-Fi接続があるのが当たり前だと感じています。だからこそ、モバイルデータ通信量を節約したいなら、スマートフォンのWi-Fiをつけっぱなしにしておくのは自然なことでしょう。しかし、多くのテクノロジーと同じように、意図した以上の情報を漏らしてしまうことがあります。Wi-Fiも例外ではありません。最も懸念すべきは、Wi-Fiネットワークに接続していなくても情報が漏れ始めるという点です。Wi-Fi接続の基本的な仕組みWi-Fiは電波を使って2つのデバイス間のネットワーク接続を確立します。通常、これはアクセスポイント(AP)やルーターとあなたのデバイスとの間で行われ