Есть ли способ получить текущий счетчик объектов в Python? - PullRequest
71 голосов
/ 04 февраля 2009

Есть ли способ получить текущий счетчик объектов в Python?

Ответы [ 3 ]

80 голосов
/ 04 февраля 2009

Согласно документации Python , модуль sys содержит функцию:

import sys
sys.getrefcount(object) #-- Returns the reference count of the object.

Как правило, на 1 больше, чем вы могли ожидать, из-за ссылки arg temp объекта.

56 голосов
/ 04 февраля 2009

Используя модуль gc, интерфейс для кишок сборщика мусора, вы можете вызвать gc.get_referrers(foo), чтобы получить список всего, что относится к foo.

Следовательно, len(gc.get_referrers(foo)) даст вам длину этого списка: количество рефереров, что вы и ищете.

См. Также документацию gc .

7 голосов
/ 11 декабря 2016

Есть 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() может потребоваться отфильтровать список рефереров.

Я бы предложил ручной подсчет ссылок для таких целей, как «изоляция при изменении», то есть «клонировать, если есть ссылка в другом месте».

...