备注
单击 here 要下载完整的示例代码,请执行以下操作
平行中间值#
使用Python标准库中的多处理模块并行实现中间中心性的示例。
中间中心性函数接受一组节点,并计算这些节点对整个网络中间中心性的贡献。在这里,我们将网络划分为多个节点,并计算它们对整个网络中间中心性的贡献。
注意:下面的示例输出显示非并行实现速度更快。这是我们在单核上运行的CI/CD流水线的限制。
根据您的设置,您可能会观察到加速。

出:
Computing betweenness centrality for:
Graph with 1000 nodes and 2991 edges
Parallel version
Time: 1.1325 seconds
Betweenness centrality for node 0: 0.14113
Non-Parallel version
Time: 2.6136 seconds
Betweenness centrality for node 0: 0.14113
Computing betweenness centrality for:
Graph with 1000 nodes and 5024 edges
Parallel version
Time: 1.3773 seconds
Betweenness centrality for node 0: 0.00209
Non-Parallel version
Time: 3.3832 seconds
Betweenness centrality for node 0: 0.00209
Computing betweenness centrality for:
Graph with 1000 nodes and 2000 edges
Parallel version
Time: 1.1916 seconds
Betweenness centrality for node 0: 0.00237
Non-Parallel version
Time: 2.4556 seconds
Betweenness centrality for node 0: 0.00237
from multiprocessing import Pool
import time
import itertools
import matplotlib.pyplot as plt
import networkx as nx
def chunks(l, n):
"""Divide a list of nodes `l` in `n` chunks"""
l_c = iter(l)
while 1:
x = tuple(itertools.islice(l_c, n))
if not x:
return
yield x
def betweenness_centrality_parallel(G, processes=None):
"""Parallel betweenness centrality function"""
p = Pool(processes=processes)
node_divisor = len(p._pool) * 4
node_chunks = list(chunks(G.nodes(), int(G.order() / node_divisor)))
num_chunks = len(node_chunks)
bt_sc = p.starmap(
nx.betweenness_centrality_subset,
zip(
[G] * num_chunks,
node_chunks,
[list(G)] * num_chunks,
[True] * num_chunks,
[None] * num_chunks,
),
)
# Reduce the partial solutions
bt_c = bt_sc[0]
for bt in bt_sc[1:]:
for n in bt:
bt_c[n] += bt[n]
return bt_c
G_ba = nx.barabasi_albert_graph(1000, 3)
G_er = nx.gnp_random_graph(1000, 0.01)
G_ws = nx.connected_watts_strogatz_graph(1000, 4, 0.1)
for G in [G_ba, G_er, G_ws]:
print("")
print("Computing betweenness centrality for:")
print(nx.info(G))
print("\tParallel version")
start = time.time()
bt = betweenness_centrality_parallel(G)
print(f"\t\tTime: {(time.time() - start):.4F} seconds")
print(f"\t\tBetweenness centrality for node 0: {bt[0]:.5f}")
print("\tNon-Parallel version")
start = time.time()
bt = nx.betweenness_centrality(G)
print(f"\t\tTime: {(time.time() - start):.4F} seconds")
print(f"\t\tBetweenness centrality for node 0: {bt[0]:.5f}")
print("")
nx.draw(G_ba, node_size=100)
plt.show()
Total running time of the script: ( 0 minutes 18.301 seconds)