Что является наиболее эффективной графической структуры данных в Python?

Мне нужно быть в состоянии управлять большим (10^7 узлов) графика в Python. Данные, соответствующие для каждого узла/края является минимальным, скажем, небольшое количество строк. Что является наиболее эффективным, с точки зрения памяти и скорости, способ сделать это?
В дикт оф предсказывает более гибкая и проще в реализации, но я интуитивно ожидал список списков, чтобы быть быстрее. В список опций также будет требовать, чтобы я хранить данные отдельно от структуры, в то время как предсказывает позволит нечто подобное:

```
graph[I][J]["Property"]="value"

```

Что бы вы предложили?
Да, я должен быть немного яснее, что я имею в виду по эффективности. В данном конкретном случае я имею в виду с точки зрения случайного получения доступа.
Загрузка данных в памяти не огромная проблема. Это сделано раз и навсегда. Трудоемкая часть-это посещение узлов, так что я могу извлечь информацию и измерить показатели меня интересуют.
Я не считал, что делает каждый узел класса (свойства одинаковы по всем узлам), но кажется, что бы добавить дополнительный уровень накладных расходов? Я надеялся, что кто-то будет иметь прямой опыт работы с подобными делами, что они могли бы поделиться. Ведь графики являются одним из самых распространенных абстракций в CS.

Мне нужно быть в состоянии управлять большим (10^7 узлов) графика в Python. Данные, соответствующие для каждого узла/края является минимальным, скажем, небольшое количество строк. Что является наиболее эффективным, с точки зрения памяти и скорости, способ сделать это?
В дикт оф предсказывает более гибкая и проще в реализации, но я интуитивно ожидал список списков, чтобы быть быстрее. В список опций также будет требовать, чтобы я хранить данные отдельно от структуры, в то время как предсказывает позволит нечто подобное:

```
graph[I][J]["Property"]="value"

```

Что бы вы предложили?
Да, я должен быть немного яснее, что я имею в виду по эффективности. В данном конкретном случае я имею в виду с точки зрения случайного получения доступа.
Загрузка данных в памяти не огромная проблема. Это сделано раз и навсегда. Трудоемкая часть-это посещение узлов, так что я могу извлечь информацию и измерить показатели меня интересуют.
Я не считал, что делает каждый узел класса (свойства одинаковы по всем узлам), но кажется, что бы добавить дополнительный уровень накладных расходов? Я надеялся, что кто-то будет иметь прямой опыт работы с подобными делами, что они могли бы поделиться. Ведь графики являются одним из самых распространенных абстракций в CS.

Я бы настоятельно рекомендуем вам взглянуть на NetworkX. Это боевые испытания боевого коня и первый инструмент большинство "исследований" типа достигают, когда им нужно сделать анализ сетевых данных. Мною манипулируют графиками с 100S тысяч краями без проблем на ноутбуке. Его многофункциональный и очень простой в использовании. Вы окажетесь сосредоточившись на решении проблемы, а не Подробности в базовой реализации.
Пример Эрдеша-Реньи случайного графа генерации и анализа

```

"""
Create an G{n,m} random graph with n nodes and m edges
and report some properties.

This graph is sometimes called the Erd##[m~Qs

Зрительные образы являются также проста:

Больше визуализации: <http://jonschull.blogspot.com/2008/08/graph-visualization.html>
```


Хотя сейчас этот вопрос довольно старый, я думаю, стоит упомянуть мой собственный модуль Python для манипуляции графа называется граф-инструмент. Это очень эффективно, поскольку структуры данных и алгоритмы реализованы на языке C , с помощью шаблона metaprograming, используя библиотеку Boost график. Поэтому его производительность (как в использование памяти и времени выполнения) сопоставимо с чистым библиотеки C , и может быть заказы лучше величине, чем типичный код на Python, без ущерба для простоты использования. Я использую его постоянно себе на работу с очень больших графов.

Как уже упоминалось, NetworkX очень хорошо, с другим вариантом является интерактивный график. Оба модуля будут иметь большинство (если не все) инструменты анализа вы, вероятно, нужно, и обе библиотеки обычно используются в больших сетях.

Словарь также может содержать накладные, в зависимости от фактической реализации. Хеш-таблица, как правило, содержат некоторое простое число доступных узлов для начала, хотя вы можете использовать только пару узлов. Судя по вашему примеру, "собственность", вы бы лучше с классовым подходом к финальному уровню и недвижимости? Или имена свойств меняется от узла к узлу? Я бы сказал, что "эффективные" средства зависит от многих вещей, таких как: скорость обновления (вставка, обновление, удаление) скорость случайного извлечения доступа скорость последовательного поиска используемая память Я думаю, что вы найдете то, что структура данных, которая является скорейшее обычно потребляют больше памяти, чем тот, что медленно. Это не всегда так, но большинство структур данных, кажется, следовать этому. Словарь может быть простым в использовании, и дать вам относительно равномерно быстрый доступ, то, скорее всего, использовать больше памяти, чем, как вы предлагаете, списки. Списки, однако, как правило, содержат больше накладные расходы при вставке в него данные, если они выделить х узлов, в которых они будут снова использовать больше памяти. Мое предложение, в целом, можно было бы просто использовать метод, который кажется наиболее естественным для вас, а затем сделать "стресс-тест" системы, добавление значительного объема данных и посмотреть, если это становится проблемой. Вы также можете добавить слой абстракции к вашей системе, так что вам не придется менять интерфейс программирования, если вам в дальнейшем нужно менять внутреннюю структуру данных.

Как я понимаю, с произвольным доступом находится в постоянном времени, так как словарь и списки в Python, разница в том, что вы можете только сделать произвольный доступ целочисленных индексов со списками. Я предполагаю, что вам нужно для поиска узла по его названию, так что вы хотите от дикт предсказывает. Однако, на передней производительности, загрузки его в память не может быть проблемой, но если вы используете слишком много, вы будете в итоге обменивать на диск, который будет убивать производительность даже высокоэффективные питона предсказывает. Попробуйте сохранить память как можно. Кроме того, Оперативная память удивительно дешево прямо сейчас; если вы делаете такого рода вещи много, нет никаких причин, чтобы не иметь по крайней мере 4 ГБ. Если вы хотите совет по поддержанию памяти вниз, дают больше информации о том, какую информацию вы отслеживаете для каждого узла.

Делая классовая структура, вероятно, имеют больше накладных расходов, чем дикт структуры, поскольку в Python классы на самом деле использовать словарь, когда они реализуются.

Без сомнения, NetworkX является лучшим структуры данных до сих пор на график. Он поставляется с утилитами, как вспомогательные функции, структуры данных и алгоритмы генераторов случайных последовательностей, декораторов, Cuthill-McKee в Заказ, менеджеры контекста NetworkX-это здорово, потому что wowrs графы, орграфы, и в этих работах мультиграфы. Он может написать график с несколькими способами: список смежности, список смежности многострочный, Список края, gexf все, Менатеп. Он работает с рассолом, GraphML, в JSON, SparseGraph6 и т. д. Он имеет реализация различных алгоритмов radimade в том числе: Аппроксимация, Состоящая Из Двух Частей, Граница, Центральности, Клики, Кластеризации, Раскраски, Компоненты Связности, Циклы, Ориентированные Графы Ациклические, Измеряет Расстояние, Доминирующих Множеств, Эйлера, Изоморфизм, Анализ, Ссылка, Ссылка Прогнозирования, Сопоставления, Минимальное Остовное Дерево, Богатый Клуб, Кратчайшего Пути, Обход, Дерево.