​​🔄 Визуализация графа ссылок

В продолжение вчерашней темы, покажу, как можно визуализировать граф ссылок объектов в Python. Возможно, кому-то это поможет решить сложные моменты с использованием памяти и с организацией нетривиальных структур данных.

0) Для рисования графов понадобится graphviz Например, на MacOS вы можете установить его через Homebrew:

brew install graphviz

1) Установим библиотеку objgraph:

pip install objgraph

2) Использование. Пусть у нас есть такая структура данных:

x = ["test"]
x.append(x)
y = [x, [x], dict(x=x), set([1, 2, "test"])]

Сохраняем граф ссылок на объекты, на которые ссылается y в файл ‘1.png’. Обратите внимание, что show_refs принимает именно список [y], а не просто y:

import objgraph
objgraph.show_refs([y], filename='1.png')

Можно для каждого объекта вывести общее число ссылок на него:

objgraph.show_refs([y], refcounts=True, filename='2.png')
Пример вывода objgraph

А можно узнать, кто наоборот ссылается на интересующий объект x, т.е. отследить цепочку ссылок до глобальных объектов:

objgraph.show_backrefs([x], filename='3-back.png')

Узнать статистику по самым распространенным объектам в текущей среде:

>>> objgraph.show_most_common_types(limit=5)
function           2127
dict               1193
wrapper_descriptor 1002
tuple              954
weakref            868

Или по конкретному типу глобально:

>>> objgraph.count('dict')
1195

Или среди конкретного списка объектов:

>>> objgraph.count('dict', [{'x':5}, {'y':6}])
2

В библиотеке еще много функций для отслеживания ссылок и статистик по объектам, но всего этого не вместить в небольшую заметку.

👉 Общая документация по objgraph 

👉 Список функций objgraph

👨‍🎓Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway! 👈

Бесплатный Нижний

Мой первый опыт на Бесплатном Нижнем прошел не так хорошо, как планировалось. Предложение я сделал весьма вкусное. Админ группы пожелал забрать предметы сам. Все бы ничего, если человеку надо. Но! При этом он даже не разместил мое объявление в группе (!). Я отметил, что это весьма непорядочный шаг, после чего мое объявление появилось аж в трех разных группах, даже в группе знакомств. На меня посыпался шквал заявок. Были и просто халявщики, и неадекваты, но многие все же излагали свою историю. Выбрать было очень сложно. В результате я решил разделить лот пополам и отдать половину первому написавшему и вторую половину человеку, чья история меня действительно задела. Некоторые из тех, кому ничего не досталось, видимо, даже обиделись. Из этого эпизода жизни я вынес двоякие выводы. Очевидно лишь то, что нужна какая-то иная модель к подобным бесплатным раздачам.

Что раздавал?

Память для ноутбука, которая осталась после апгрейда.

Почему не предложил сначала друзьям?

Желание отдать память появилось спонтанно во время чтения ленты сообщества Бесплатный Нижний. Захотелось именно там попробовать провести эту акцию. Потом, если бы желающих друзей оказалось также много? Опять пришлось бы выбирать, а среди друзей это тяжелее, чем среди незнакомцев.