Jaka jest najbardziej efektywna struktura danych wykresów w Pythonie? [zamknięte]

Muszę być w stanie manipulować dużym (10^7 węzłów) wykresem w Pythonie. Dane odpowiadające poszczególnym węzłom / krawędziom to minimalna, powiedzmy, mała liczba łańcuchów. Co jest najskuteczniejsze pod względem pamięć i szybkość, Jak to zrobić?

Dict of dicts jest bardziej elastyczny i prostszy w implementacji, ale intuicyjnie oczekuję, że lista list będzie szybsza. Opcja lista wymagałaby również oddzielenia danych od struktury, podczas gdy dicts pozwalałoby dla czegoś takiego:

graph[I][J]["Property"]="value"
Co sugerujesz?

Tak, powinienem być nieco jaśniejszy, co mam na myśli przez efektywność. W tym konkretnym przypadku mam na myśli to w kategoriach losowego dostępu do Internetu.

Wczytywanie danych do pamięci nie jest wielkim problemem. To się robi raz na zawsze. Czasochłonną częścią jest odwiedzanie węzłów, dzięki czemu mogę wyodrębnić informacje i zmierzyć metryki, które mnie interesują.

Nie rozważałem uczynienia każdego węzła klasą (właściwości są takie same dla wszystkich węzłów), ale wydaje się, że to dodałoby dodatkową warstwę nad głową? Miałem nadzieję, że ktoś będzie miał jakieś bezpośrednie doświadczenie z podobną sprawą, którą mógłby się podzielić. W końcu wykresy są jedną z najczęstszych abstrakcji w CS.

Author: Dominique Fortin, 2008-08-04

7 answers

Zdecydowanie zalecałbym, abyś spojrzał na NetworkX . Jest to przetestowany w boju koń wojenny i pierwsze narzędzie, po które większość typów "badawczych" sięga, gdy potrzebuje analizy danych sieciowych. Manipulowałem wykresami ze 100 tysiącami krawędzi bez problemu na notebooku. Jego bogaty w funkcje i bardzo łatwy w użyciu. Znajdziesz się skupiając się bardziej na problemie pod ręką, a nie Szczegóły w podstawowej realizacji.

Przykład Erdős-Rényi generowanie i analiza wykresów losowych


"""
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-Rényi graph
but is different from G{n,p} or binomial_graph which is also
sometimes called the Erd##[m~Qs-Rényi graph.
"""
__author__ = """Aric Hagberg ([email protected])"""
__credits__ = """"""
#    Copyright (C) 2004-2006 by 
#    Aric Hagberg 
#    Dan Schult 
#    Pieter Swart 
#    Distributed under the terms of the GNU Lesser General Public License
#    http://www.gnu.org/copyleft/lesser.html

from networkx import *
import sys

n=10 # 10 nodes
m=20 # 20 edges

G=gnm_random_graph(n,m)

# some properties
print "node degree clustering"
for v in nodes(G):
    print v,degree(G,v),clustering(G,v)

# print the adjacency list to terminal 
write_adjlist(G,sys.stdout)

Wizualizacje są również proste:

Tutaj wpisz opis obrazka

Więcej wizualizacji: http://jonschull.blogspot.com/2008/08/graph-visualization.html

 51
Author: Ryan Cox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-01 14:56:19

Mimo że to pytanie jest już dość stare, myślę, że warto wspomnieć o moim własnym module Pythona do manipulacji grafem o nazwie graph-tool . Jest bardzo wydajny, ponieważ struktury danych i algorytmy są zaimplementowane w C++, z metaprogramowaniem szablonów, przy użyciu biblioteki Boost Graph. Dlatego jego wydajność (zarówno w użyciu pamięci, jak i podczas pracy) jest porównywalna z czystą biblioteką C++ i może być o rząd wielkości lepsza niż typowy kod Pythona, bez poświęcania łatwości użyj. Sam używam go stale do pracy z bardzo dużymi grafami.

 12
Author: Tiago Peixoto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-10 08:59:11

Jak już wspomniano, NetworkX jest bardzo dobry, a inną opcją jest igraph . Oba moduły będą miały większość (jeśli nie wszystkie) narzędzi analitycznych, których prawdopodobnie potrzebujesz, a obie biblioteki są rutynowo używane w dużych sieciach.

 6
Author: Kai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 10:01:21

Słownik może również zawierać nagłówki, w zależności od rzeczywistej implementacji. Hashtable zazwyczaj zawiera pewną liczbę początkową dostępnych węzłów, nawet jeśli można użyć tylko kilku z nich.

Sądząc po twoim przykładzie, "Property", czy byłoby lepiej z klasowym podejściem do końcowego poziomu i nieruchomości? A może nazwy właściwości zmieniają się z węzła na węzeł?

Powiedziałbym, że to, co oznacza" efektywny", zależy od wielu rzeczy, like:

  • szybkość aktualizacji (insert, update, delete)
  • szybkość pobierania dostępu losowego
  • prędkość pobierania sekwencyjnego
  • pamięć używana

Myślę, że przekonasz się, że struktura danych, która jest szybka, pochłonie więcej pamięci niż ta, która jest powolna. Nie zawsze tak jest, ale większość struktur danych wydaje się podążać za tym.

Słownik może być łatwy w użyciu i daje stosunkowo szybki dostęp, najprawdopodobniej będzie używał więcej pamięci niż, jak sugerujesz, listy. Listy zazwyczaj zawierają więcej narzutu, gdy wstawiasz do nich dane, chyba że wstępnie przydzielają węzły X, w których ponownie zużywają więcej pamięci.

Moja sugestia, ogólnie rzecz biorąc, byłoby po prostu użyć metody, która wydaje się najbardziej naturalna dla Ciebie, a następnie zrobić "test warunków skrajnych" systemu, dodając znaczną ilość danych do niego i zobaczyć, czy nie stanie się to problemem.

Możesz również rozważyć dodanie warstwy abstrakcji do swojego system, dzięki czemu nie trzeba zmieniać interfejsu programowania, jeśli później trzeba zmienić wewnętrzną strukturę danych.

 4
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 12:09:55

Jak rozumiem, random access jest w stałym czasie zarówno dla dictów Pythona, jak i list, różnica polega na tym, że możesz zrobić tylko losowy dostęp do indeksów całkowitych z listami. Zakładam, że musisz wyszukać węzeł po jego etykiecie, więc chcesz dict dicts.

Jednakże, jeśli chodzi o wydajność, załadowanie go do pamięci może nie być problemem, ale jeśli użyjesz zbyt dużo, zamienisz go na dysk, co zabije wydajność nawet bardzo wydajnych dictów Pythona. Spróbuj zmniejsz zużycie pamięci tak bardzo, jak to możliwe. Ponadto, RAM jest teraz niesamowicie tani; jeśli robisz tego rodzaju rzeczy dużo, nie ma powodu, aby nie mieć co najmniej 4GB.

Jeśli potrzebujesz porady na temat zmniejszenia zużycia pamięci, podaj więcej informacji o rodzaju informacji, które śledzisz dla każdego węzła.

 3
Author: Peter Burns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-06 05:37:33

Tworzenie struktury opartej na klasach prawdopodobnie miałoby więcej kosztów niż struktura oparta na dict, ponieważ w Pythonie klasy faktycznie używają dict, gdy są implementowane.

 2
Author: Matthew Schinckel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 12:41:15

Bez wątpienia NetworkX jest do tej pory najlepszą strukturą danych dla grafu. Zawiera narzędzia takie jak funkcje pomocnicze, struktury danych i algorytmy, Generatory sekwencji losowych, dekoratory, zamawianie Cuthill-Mckee, Menedżery kontekstu

NetworkX jest świetny, ponieważ wowrs dla Wykresów, digrafów i multigrafów. Może pisać wykres na wiele sposobów: lista adiacencka, lista adiacencka Wieloliniowa, Edge List, GEXF, GML. Współpracuje z Pickle, GraphML, JSON, SparseGraph6 itp.

MA zaimplementowanie różnych algorytmów radimade, w tym: Aproksymacja, Dwudzielność, Granica, Centralizacja, Klika, Klastrowanie, Kolorowanie, Komponenty, Łączność, Cykle, Kierowane Wykresy Acykliczne, Miary Odległości, Zbiory Dominujące, Eulerian, Izomorfizm, Analiza Linków, Przewidywanie Linków, Dopasowanie, Minimalne Drzewo Rozpiętości, Bogaty Klub, Najkrótsze Ścieżki, Trawers, Drzewo.

 1
Author: Pranav Waila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 09:08:03