Python en verimli grafik veri yapısı nedir?

oy
63

Python büyük (10 ^ 7 düğümler) grafiği değiştirmek için mümkün olması gerekmektedir. Her bir düğüm / kenarına karşılık gelen veri, diyelim ki şeritlerinin az sayıda çok azdır. Açısından en verimli nedir bellek ve hız , bunu yapmanın yolu?

dicts bir dict uygulamak için daha esnek ve daha basit, ama sezgisel olarak listelerin bir liste daha hızlı olmasını bekliyoruz. Liste seçeneği de ben dicts tür bir şey için izin verecek iken veriler yapıdan ayrı tutmak gerektirecektir:

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

Ne öneriyorsun?


Evet, ben verimliliği ile ne demek biraz daha net olması gerekirdi. Bu özel durumda ben rasgele erişim alma açısından söylüyorum.

belleğe veri yüklenmesi çok büyük bir sorun değildir. Yani ilk ve son kez bitti. Ben bilgi ayıklamak ve ilgilendiğim ölçümlerini ölçmek için zaman alıcı kısmı düğümleri ziyaret ediyor.

Her düğüm bir sınıf yapma kabul etmemişti (özellikler tüm düğümler için aynıdır) ama bu yükü bir kat daha eklersiniz gibi görünüyor? Birinin paylaştıkları olabilir benzer bir vaka ile bazı muhatap umuyordum. Sonuçta, grafikler CS en yaygın soyutlamaların biridir.

Oluştur 04/08/2008 saat 13:00
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
51

Ben şiddetle bakmak savunacağını söyledi NetworkX . Bu bir savaş görmüş savaş atı ve ağ tabanlı veri analiz yapmak gerektiğinde en 'araştırma' türleri ulaşmak ilk araçtır. Bir dizüstü bilgisayarda sorunsuz kenarları binlerce 100'ün grafikleri manipüle var. Onun özelliği zengin ve kullanımı çok kolay. Sen kendin oldukça altında yatan uygulanmasında ayrıntılar daha eldeki problem daha fazla odaklanarak bulacaksınız.

Örnek erdos-Rényi rastgele grafik oluşturma ve analiz


"""
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)

Görselleştirmeler da basittir:

Burada görüntü açıklama girin

Daha görselleştirme: http://jonschull.blogspot.com/2008/08/graph-visualization.html

Cevap 26/08/2008 saat 18:43
kaynak kullanıcı

oy
12

Bu soru şimdi oldukça eski olmasına rağmen, bunun grafik manipülasyon olarak adlandırılan için kendi piton modülünü söz değerli olduğunu düşünüyorum grafik-aracı . Veri yapıları ve algoritmalar Boost Grafik Kütüphanesi kullanarak, şablon metaprograming ile, C ++ uygulanır, çünkü çok verimlidir. Bu nedenle, (hafıza kullanımı ve çalışma zamanı hem de) performans saf C ++ kütüphanesi ile karşılaştırılabilir ve kullanım kolaylığı ödün vermeden, tipik piton kod daha iyi olan büyüklüklerdir olabilir. Kendimi sürekli çok büyük grafikleri ile çalışmak için kullanabilirsiniz.

Cevap 27/11/2010 saat 15:10
kaynak kullanıcı

oy
6

Daha önce bahsedildiği gibi, NetworkX başka bir seçenek olmak üzere çok iyidir iGRAPH . Her iki modül İhtiyacınız olasıdır analiz araçları (hepsi değilse de) çoğu olacak ve her iki kütüphaneler rutin olarak büyük ağlarda kullanılır.

Cevap 27/08/2008 saat 11:01
kaynak kullanıcı

oy
4

Bir sözlük de fiili uygulamaya bağlı, havai içerebilir. Hashtable'a genellikle sadece düğüm birkaç kullanabilirsiniz olsa bile, başlamak için mevcut düğümlerin bazı asal sayı içerir.

senin Örneğin, "Mülkiyet", bakılırsa nihai seviyesi ve gerçek özellikleri için bir sınıf yaklaşımla daha iyi olurdu? Veya düğümden düğüme bir çok değişen özelliklerin isimleri nedir?

Ne "verimli" anlamına gelir gibi şeyler, bir çok bağlı olduğunu söyleyebilirim:

  • güncellemeleri hızı (insert, güncelleme, silme)
  • Rastgele erişim alma hızı
  • ardışık alma hızı
  • kullanılan bellek

Sana hızlı iradesidir bir veri yapısı genellikle yavaş olandan daha fazla bellek tüketir olduğunu göreceksiniz düşünüyorum. Bu her zaman böyle değildir, ama çoğu veri yapıları bu takip görünüyor.

Bir sözlük kullanımı kolay olacak, ve eğer önerdiği gibi, büyük olasılıkla, daha fazla bellek kullanır size listeler nispeten eşit hızlı erişim verebilir. Listeler Ancak genelde onlar yine daha fazla bellek kullanır ki burada X düğümlerini, preallocate sürece, içine veri eklediğinizde fazla yükü içeren eğilimindedir.

Benim önerim, genel olarak, sadece sizin için en doğal görünüyor yöntemi kullanın ve sonra sistemin bir "stres testi" yapmak, buna verilerin önemli miktarda eklenmesi ve bir sorun olup olmadığını görmek için olurdu.

Eğer iç veri yapısını değiştirmek gereği üzerinde eğer sonradan programlama arabirimi değiştirmek zorunda kalmamak için de, sisteminize soyutlama katmanı eklemeyi düşünebilirsiniz.

Cevap 04/08/2008 saat 13:09
kaynak kullanıcı

oy
3

Anladığım kadarıyla, rasgele erişim Python'un dicts ve listeler her ikisi için sabit zamanda ise, fark sadece listeleri ile tamsayı endekslerinin rastgele erişim yapabiliyor olmasıdır. Ben onun etikete göre bir düğümü arama gerektiğini tahmin ediyorum, bu yüzden dicts bir dicti istiyorum.

Ancak, performans cephesinde belleğe yüklenerek bir sorun olmayabilir, ama çok fazla kullanırsanız bile Python'un yüksek verimli dicts performansını öldürecektir disk, takas bitireceğiz. Mümkün olduğunca bellek kullanımını kontrol etmeye çalışın. Ayrıca RAM şu anda inanılmaz ucuz; Eğer bu tür şeyleri çok yaparsanız, en azından 4GB için hiçbir neden yoktur.

aşağı bellek kullanımı tutmak konusunda tavsiye isterseniz, her düğüm için izlediğiniz bilgi türü hakkında biraz daha bilgi verir.

Cevap 06/08/2008 saat 06:37
kaynak kullanıcı

oy
2

sınıf tabanlı bir yapıya yapma muhtemelen uygulandığında piton sınıfları aslında dicts kullanmak beri dict tabanlı yapıya göre daha yükü, olurdu.

Cevap 04/08/2008 saat 13:41
kaynak kullanıcı

oy
1

Şüphesiz NetworkX şimdi grafik için en iyi bağ veri yapısıdır. Bu Yardımcısı Fonksiyonlar, Veri Yapıları ve Algoritmalar, Rastgele Dizi Jeneratörler, Dekoratörler, Cuthill-McKee Sipariş, Bağlam Yöneticileri gibi uygulama ile gelmektedir

o grafikler, digraphs ve multigraphs için wowrs çünkü NetworkX harika. Bitişiklik listesi, satırlı bitişiklik listesi, Kenar Listesi, GEXF, GML: Bu birden fazla yol ile grafik yazabilir. Bu turşu GraphML, JSON'dan SparseGraph6 vb ile çalışır

Eşleştirme, Yaklaşımı, ikili, Boundary, Merkezliği, Klik, Kümelenme, Boyama, Bileşenler, Bağlantı, Cycles, yönettiği Mercury Grafikler, Mesafe Tedbirler, hâkim Setleri, Euler, İzomorfizmler, Bağlantı Analizi, Bağlantı Prediction: Bu gibi çeşitli radimade algoritmaların implimentation vardır Minimum Kapsayan Ağaç, Zengin Kulübü, kısa yollar, Geçişi, ağacı.

Cevap 18/01/2016 saat 09:08
kaynak kullanıcı

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