使用Python

时间:2015-07-20 03:33:33

标签: python list hash networkx shuffle

我有一个大型网络需要分析。例如:

import networkx as nx
import random

BA = nx.random_graphs.barabasi_albert_graph(1000000, 3)
nx.info(BA)

我必须改变边缘,同时保持度数分布不变。 Maslov引入了基本思想。因此,我的同事和我写了一个shuffleNetwork函数,我们在网络对象G上工作了num次。 edges是一个列表对象。

问题是此功能对大型网络运行速度太慢。我尝试使用 set dict 而不是 list 作为edge对象(set和dict是哈希表)。但是,由于我们还需要删除并添加元素,因此时间复杂度变得更大。

您对进一步优化此功能有什么建议吗?

def shuffleNetwork(G,Num):
    edges=G.edges()
    l=range(len(edges))
    for n in range(Num):
        i,j = random.sample(l, 2)
        a,b=edges[i]
        c,d=edges[j]
        if a != d and c!= b:
            if not (a,d) in edges or (d, a) in edges or (c,b) in edges or (b, c) in edges:
                edges[i]=(a,d)
                edges[j]=(c,b)
    K=nx.from_edgelist(edges)
    return K



import timeit
start = timeit.default_timer()
#Your statements here
gr = shuffleNetwork(BA, 1000)
stop = timeit.default_timer()
print stop - start 

1 个答案:

答案 0 :(得分:4)

您应该考虑使用nx.double_edge_swap

文档为here。它看起来完全符合您的要求,但会修改图形。

我不确定它是否会解决速度问题,但它确实避免生成列表,所以我认为它会比你得到的更好。

您可以使用nx.double_edge_swap(G,nswap=number)

来调用它