#python #graph #social-networking #libraries
#python #График #социальные сети #библиотеки
Вопрос:
Меня интересует сетевой анализ в больших сетях с миллионами узлов и десятками миллионов ребер. Я хочу иметь возможность делать такие вещи, как анализировать сети из многих форматов, находить подключенные компоненты, обнаруживать сообщества и запускать меры централизации, такие как PageRank.
Меня привлекает NetworkX, потому что у него хороший api, хорошая документация и он находится в активной разработке в течение многих лет. Кроме того, поскольку он написан на python, он должен быть быстрым в разработке.
В недавней презентации (слайды доступны на github здесь) утверждалось, что:
В отличие от многих других инструментов, NX предназначен для обработки данных в масштабе, соответствующем современным задачам…Большинство основных алгоритмов в NX полагаются на чрезвычайно быстрый устаревший код.
В презентации также говорится, что базовые алгоритмы NetworkX реализованы на C / Fortran.
Однако, глядя на исходный код, кажется, что NetworkX в основном написан на python. Я не слишком знаком с исходным кодом, но мне известно о паре примеров, когда NetworkX использует numpy для выполнения тяжелой работы (которая, в свою очередь, использует C / Fortran для выполнения линейной алгебры). Например, файл networkx/networkx/algorithms/centrality/eigenvector.py
использует numpy для вычисления собственных векторов.
Кто-нибудь знает, действительно ли эта стратегия вызова оптимизированной библиотеки, такой как numpy, распространена во всем NetworkX, или это делают всего несколько алгоритмов? Также кто-нибудь может описать другие проблемы масштабируемости, связанные с NetworkX?
Ответ ведущего программиста NetworkX Я задал этот вопрос в списке рассылки NetworkX, и Арик Хагберг ответил:
Структуры данных, используемые в NetworkX, подходят для масштабирования больших задач (например, структура данных представляет собой список смежности). Алгоритмы имеют различные свойства масштабирования, но некоторые из тех, которые вы упомянули, можно использовать (например, PageRank, подключенные компоненты, линейная сложность по количеству ребер).
На данный момент NetworkX — это чистый код на Python. Структура смежности кодируется словарями Python, что обеспечивает большую гибкость за счет памяти и скорости вычислений. Большие графики будут занимать много памяти, и вы в конечном итоге исчерпаете ее.
NetworkX использует NumPy и SciPy для алгоритмов, которые в основном основаны на линейной алгебре. В этом случае граф представляется (копируется) в виде матрицы смежности с использованием либо NumPy-матриц, либо SciPy-разреженных матриц. Эти алгоритмы могут извлечь выгоду из устаревшего кода на C и FORTRAN, который используется в NumPy и SciPY.
Комментарии:
1. Кажется, у меня возникли проблемы с проверкой исходного кода на данный момент. Но в любом случае учтите: 80% времени может быть потрачено на 20% кода. Mercurial написан в основном на Python, но я не слышал, чтобы кто-то жаловался на его скорость по сравнению с Git, который в основном C.
2. Да, но я также беспокоюсь о памяти. Графическое представление в networkx представляет собой библиотеку python. Будет ли это означать, что я могу помещать в память только меньшие графики?
Ответ №1:
Это старый вопрос, но я думаю, стоит упомянуть, что graph-tool обладает очень похожей функциональностью на NetworkX, но он реализован на C с помощью шаблонов (с использованием библиотеки Boost Graph) и, следовательно, намного быстрее (до двух порядков) и использует гораздо меньше памяти.
Отказ от ответственности: Я автор graph-tool.
Комментарии:
1. Я попробовал graph-tool. Это действительно намного быстрее, но довольно некрасиво в использовании. API не похож на pythonic.
2. Да, вы можете легко справиться с этим с любым ноутбуком.
3. @user1938107 Это требует существенных изменений в библиотеке, а у меня даже нет компьютера с Windows.
4. @user1938107 Я бы предпочел заплатить вам 10 центов за установку правильной операционной системы на ваш…
5. @opt C по-прежнему на порядки быстрее, чем чистый Python в 2019 году, поэтому ответ — да. Проект не заброшен вообще. Эта страница github не является официальной, это просто какая-то случайная вилка. Веб-сайт довольно современный, как и страница gitlab.
Ответ №2:
Вашей большой проблемой будет память. Python просто не может обрабатывать десятки миллионов объектов, не перепрыгивая через обручи в реализации вашего класса. Нагрузка на память многих объектов слишком высока, вы набираете 2 ГБ, и 32-битный код не будет работать. Есть способы обойти это — с помощью слотов, массивов или NumPy. Все должно быть в порядке, потому что networkx был написан для повышения производительности, но если есть несколько вещей, которые не работают, я проверю использование вашей памяти.
Что касается масштабирования, алгоритмы — это, по сути, единственное, что имеет значение для графиков. Графовые алгоритмы, как правило, имеют действительно уродливое масштабирование, если они выполнены неправильно, и они с такой же вероятностью будут выполнены правильно в Python, как и в любом другом языке.
Ответ №3:
Тот факт, что NetworkX в основном написан на python, не означает, что он не масштабируется и не претендует на совершенство. Всегда есть компромисс. Если вы вложите больше денег в свои «машины», у вас будет столько масштабируемости, сколько вы хотите, плюс преимущества использования библиотеки pythonic graph.
Если нет, то есть другие решения ( здесь и здесь ), которые могут потреблять меньше памяти (сравните и посмотрите, я думаю, что igraph полностью поддерживается на C, так и будет), но вы можете пропустить pythonic ощущение NX.
Комментарии:
1. Это частично отвечает на мой вопрос. Но я также хочу знать, реализованы ли многие из «основных» алгоритмов NetworkX на C / Fortran, как утверждается.
2. Я немного изучил (текущий) исходный код и не нашел реализаций C / Fortran. Кажется, что все там — чистый python…
3. спасибо, что взглянули. Помните, что если вызывается numpy, то (в зависимости от конфигурации системы) numpy может использовать LAPACK или другие оптимизированные пакеты линейной алгебры. Я не слишком знаком с тем, как часто NetworkX на самом деле использует numpy (это вроде моего вопроса), но я знаю пару примеров. Например, в networkx/networkx/algorithms/centrality/eigenvector.py использует numpy для нахождения собственных векторов.
4. Присоединяюсь как автор igraph, одной из библиотек, упомянутых выше. Ядро igraph реализовано на ~ 90% C и ~ 10% C , и я без проблем обрабатывал графики с ~ 2 миллионами узлов и ~ 7 миллионами ребер с помощью igraph. Он имеет интерфейс Python, поэтому вы можете использовать его из Python, но из-за его наследия C API Python не такой элегантный, как у NetworkX. Например, узлы и ребра всегда идентифицируются целыми числами в igraph (поскольку с ними намного проще работать на уровне C), и вам нужно использовать атрибуты вершин / ребер, чтобы сопоставить их с вашими реальными объектами.