簡體   English   中英

Networkx:具有字典屬性表的節點作為對象或節點作為ID

[英]Networkx: Nodes as Objects OR Nodes as ID's with Dictionary Attribute Tables

就內存管理和計算速度而言,哪一個最有效?

下面的簡單測試表明,將節點內的屬性存儲為python對象要好於通過屬性表進行字典查找。 由於如何分配內存,情況是否總是這樣?

作為測試,我構造了一個簡單的示例:

class country():
    def __init__(self, name, gdp):
        self.name = name
        self.gdp = gdp
    def __repr__(self):
        return str(self.name)

#Country Objects
countries = dict()
countries['AUS'] = country('AUS', 2000)
countries['USA'] = country('USA', 10000)
countries['ZWE'] = country('ZWE', 13)

#Attribute Dictionary
gdp = dict()
gdp['AUS'] = 2000
gdp['USA'] = 10000
gdp['ZWE'] = 13

建立網絡:

#Nodes as ID's
G1 = nx.Graph()
G1.add_nodes_from(countries.keys())
G1.nodes()

#Nodes as Objects
G2 = nx.Graph()
for c in countries.keys():
    G2.add_node(countries[c])
G2.nodes()

在IPython中運行%timeit:

G1f()

#Lookup Data from Strings Network
def G1f():
    for n in G1.nodes():
        print "Node: %s" % n
        print "\tGDP: %s" % gdp[n]
%timeit G1f

G1f()的輸出:

10000000 loops, best of 3: 26.4 ns per loop

G2f()

#Lookup Data from Objects 
def G2f():
    for n in G2.nodes():
        print "Node: %s" % n.name
        print "\tGDP: %s" % n.gdp
%timeit G2f 

G2f()的輸出

10000000 loops, best of 3: 21.8 ns per loop

更新

G3f()[來自答案]

G3 = nx.Graph()
for c,v in gdp.items():
    G3.add_node(c, gdp=v)
def G3f():
    for n,d in G3.nodes(data=True):
        print "Node: %s" % n
        print "\tGDP: %s" % d['gdp']

G13f()的輸出:

10000 loops, best of 3: 63 µs per loop

您還可以使用以下節點屬性:

import networkx as nx
#Attribute Dictionary
gdp = dict()
gdp['AUS'] = 2000
gdp['USA'] = 10000
gdp['ZWE'] = 13

G3 = nx.Graph()
for c,v in gdp.items():
    G3.add_node(c, gdp=v)

print G3.nodes(data=True)

def G3f():
    for n,d in G3.nodes(data=True):
        print "Node: %s" % n
        print "\tGDP: %s" % d['gdp']

我不清楚測試時間是否非常重要。 除非這是一個非常大的問題(也許有一天每個人都會有自己的國家!),否則速度或內存上的差異可能不會太大。 我懷疑創建許多小型自定義對象(country())的開銷最終將占用更多的內存和時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM