Pythonでオブジェクトの現在の参照カウントを取得する方法はありますか?
回答:
Pythonのによるとドキュメンテーション、sys
モジュールは機能が含まれています。
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
オブジェクト引数の一時参照のため、通常、予想より1高くなります。
gc
ガベージコレクターガットへのインターフェイスであるモジュールを使用して、gc.get_referrers(foo)
を参照するすべてのリストを取得するために呼び出すことができますfoo
。
したがって、len(gc.get_referrers(foo))
そのリストの長さ、つまりリファラーの数がわかります。これは、あなたが求めているものです。
gc
モジュールのドキュメントも参照してください。
sys.getrefcount(object)
)はlen(gc.get_referrers(foo))
、本当に数字だけが必要な場合は、よりも簡単です。
ありますgc.get_referrers()
とsys.getrefcount()
。しかし、sys.getrefcount(X)
従来の参照カウントの目的にどのように役立つかを理解するのは難しいです。考えてみましょう:
import sys
def function(X):
sub_function(X)
def sub_function(X):
sub_sub_function(X)
def sub_sub_function(X):
print sys.getrefcount(X)
次にfunction(SomeObject)
、「7」を
sub_function(SomeObject)
配信し、「5」を
sub_sub_function(SomeObject)
配信し、「3」を
sys.getrefcount(SomeObject)
配信し、「2」を配信します。
言い換えると、を使用sys.getrefcount()
する場合は、関数呼び出しの深さに注意する必要があります。gc.get_referrers()
1参照元のリストをフィルタリングする必要がある場合があります。
「変更時の分離」、つまり「他の場所で参照されている場合はクローン」などの目的で、手動の参照カウントを行うことを提案します。
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypesは、変数のアドレスを引数として取ります。sys.getRefCountよりもctypesを使用する利点は、結果から1を引く必要がないことです。