Co jest najbardziej efektywna struktura danych wykresu w Pythonie?

głosy
63

Muszę być w stanie operować dużą ^ 7 (10 węzłów), wykres w pytona. Dane odnoszące się do każdego węzła / minimalna krawędzi wynosi, na przykład, mała liczba łańcuchów. Co jest najbardziej efektywne, jeśli chodzi o pamięci i szybkość , sposób to zrobić?

Dict z dicts jest bardziej elastyczne i łatwiejsze do wdrożenia, ale intuicyjnie spodziewać się lista list będzie szybciej. Opcja lista będzie również wymagać, że trzymam dane oddzielone od struktury, a dicts pozwoliłby na coś w tym rodzaju:

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

Co byś zasugerował?


Tak, powinienem być nieco jaśniejsze, co mam na myśli sprawności. W tym konkretnym przypadku, to znaczy w zakresie pozyskiwania dostępu losowego.

Ładowanie danych do pamięci nie jest to ogromny problem. Że skończy raz na zawsze. Czas zużywa część odwiedza węzły więc mogę wydobyć informacje i zmierzyć metryki Jestem zainteresowany.

Nie uważał co każdy węzeł klasy (właściwości są takie same dla wszystkich węzłów), ale wydaje się, że byłoby dodać dodatkową warstwę narzutu? Miałem nadzieję, że ktoś będzie miał jakieś bezpośrednie doświadczenie z podobnej sprawie, że mogą dzielić. Po tym wszystkim, wykresy są jedną z najczęstszych abstrakcji w CS.

Utwórz 04/08/2008 o 13:00
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
51

Zdecydowanie opowiadamy obejrzysz NetworkX . To walka testowane War Horse i pierwszym narzędziem większość typów „badania” sięgnąć, kiedy trzeba zrobić analizę danych sieciowych opartych. Mam manipulować wykresy z 100s tysięcy krawędziach bez problemu na notebooku. Jego funkcjonalny i bardzo łatwy w użyciu. Znajdą się koncentrując się bardziej na problem pod ręką zamiast szczegółów w podstawowej implementacji.

Przykład Erdősa-Renyi generowania losowego i analizy wykresu


"""
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 (hagberg@lanl.gov)"""
__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ż bardzo proste:

wprowadzić opis obrazu tutaj

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

Odpowiedział 26/08/2008 o 18:43
źródło użytkownik

głosy
12

Nawet jeśli ta kwestia jest już dość stary, myślę, że warto wspomnieć o mój własny moduł Pythona do manipulacji wykres zwany wykres-narzędzia . Jest bardzo wydajny, gdyż struktury danych i algorytmy są realizowane w języku C ++, z szablonu metaprograming korzystając Boost Graph Library. Dlatego jego wydajność (zarówno zużycie pamięci i czas pracy) jest porównywalny z czystym C ++ biblioteki i może być rzędy wielkości lepsze niż typowego kodu Pythona, bez poświęcania łatwość użytkowania. Używam go sobie stale pracować z bardzo dużych wykresów.

Odpowiedział 27/11/2010 o 15:10
źródło użytkownik

głosy
6

Jak już wspomniano, NetworkX jest bardzo dobra, z innej opcji będącej igraph . Oba moduły mają większość (jeśli nie wszystkie) z narzędzi analitycznych ty najprawdopodobniej potrzebował, a obie biblioteki są rutynowo stosowane w dużych sieciach.

Odpowiedział 27/08/2008 o 11:01
źródło użytkownik

głosy
4

Słownik mogą zawierać również nad głową, w zależności od rzeczywistej realizacji. Hashtable zazwyczaj zawierają pewną liczbę pierwszą dostępnych węzłów na początku, choć można użyć tylko kilka węzłów.

Sądząc po swoim przykładzie, „własność”, można byłoby lepiej z podejściem klasy do ostatecznego poziomu i nieruchomościach? Albo to nazwy właściwościach zmieniających się wiele od węzła do węzła?

Powiedziałbym, że to, co „skuteczne” środki zależy od wielu rzeczy, takich jak:

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

Myślę, że przekonasz się, że struktura danych, który jest szybki na ogół zużywają więcej pamięci niż jeden, który jest powolny. To nie zawsze tak jest, ale większość struktur danych wydaje się podążać tym.

Słownik może być łatwe w użyciu i daje stosunkowo równomiernie szybki dostęp, będzie to najprawdopodobniej więcej pamięci niż, jak sugerujesz, list. Listy, jednak na ogół zawierają dodatkowe koszty podczas wstawiania danych do niego, chyba że przydzielenia X węzłów, w których będą one ponownie wykorzystać więcej pamięci.

Moja propozycja, w ogóle, byłoby po prostu użyć metody, która wydaje się najbardziej naturalnym dla Ciebie, a następnie zrobić „stress test” systemu, dodanie znacznej ilości danych do niego i zobaczyć, czy to staje się problemem.

Można także rozważyć dodanie warstwy abstrakcji do systemu, dzięki czemu nie trzeba zmieniać interfejsu programowania Jeśli później na potrzeby zmiany wewnętrznej struktury danych.

Odpowiedział 04/08/2008 o 13:09
źródło użytkownik

głosy
3

Jak rozumiem, o dostępie swobodnym jest w stałym czasie dla obu dicts i list Pythona, różnica jest taka, że ​​można to zrobić tylko swobodny dostęp indeksów całkowitych z list. Jestem zakładając, że trzeba do wyszukiwania węzeł o etykiecie, więc chcesz dict z dicts.

Jednak na froncie wydajności, załadowanie go do pamięci może nie być problemem, ale jeśli używasz zbyt dużo będziesz skończyć wymiany na dysku, który zabije wydajność nawet wysoce wydajnych dicts Pythona. Spróbuj utrzymać zużycie pamięci w dół jak najwięcej. Również RAM jest teraz niezwykle tani; jeśli robisz tego typu rzeczy dużo, nie ma powodu, aby nie mieć co najmniej 4 GB.

Jeśli chcesz porady na utrzymanie zużycia pamięci w dół, dać trochę więcej informacji na temat rodzaju informacji, który śledzisz dla każdego węzła.

Odpowiedział 06/08/2008 o 06:37
źródło użytkownik

głosy
2

Dokonywanie strukturę klasę oparte prawdopodobnie mają większe obciążenie niż struktura dict oparte, ponieważ w klasach Pythona faktycznie korzysta dicts gdy są one realizowane.

Odpowiedział 04/08/2008 o 13:41
źródło użytkownik

głosy
1

Bez wątpienia NetworkX jest najlepsza struktura danych dotychczas na wykresie. Pochodzi z narzędzi takich jak funkcje pomocnicze, struktur danych i algorytmów, Random Generatory sekwencji, dekoratorów, Cuthill-McKee zamawianiu Menedżerów Context

NetworkX jest wielki, ponieważ wowrs do wykresów, digrafach i multigraphs. Można go napisać wykres wiele sposobów: adjacency listy, wielowierszowego adjacency List, List Edge GEXF, GML. Współpracuje z marynowane, GraphML, JSON, SparseGraph6 etc.

Ma implimentation różnych radimade algorytmów, w tym: przybliżenie, dwustronny, granica, centralną lokalizację, Clique, klastrowania, Farbowanie, surowce, łączność, rowery, Directed acykliczne wykresów, mierzy dystans, zbiór dominujący, Eulera, izomorfizm, Link Analiza, prognozowanie Link Matching Minimum Spanning Tree, Rich Club, Najkrótsze ścieżki, przepływem, Drzewo.

Odpowiedział 18/01/2016 o 09:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more