我创建了这个程序,主要是为了理解Networkx和并行化的工作原理:
import random
import numpy as np
import networxk as nx
import multiprocessing
def unpack(func):
@wraps(func)
def wrapper(arg_tuple):
return func(*arg_tuple)
return wrapper
@unpack
def parallel_job(seed,shift):
N = 1000
k = 10
random.seed(seed)
np.random.seed(seed)
#Use Networkx to generate a random graph.
G = nx.erdos_renyi_graph(int(N),k/float(N), seed = seed)
#select 10 random nodes and print them
for j in range(10):
I = [10]
S = [N - I[0]]
X = np.array([0]*S[0] +[1]*I[0]).reshape((N,1))
np.random.shuffle(X)
print X
if __name__ == "__main__":
threadnum = 10
simnum = 10
seed = [j*2759 + 37*j**2 + 4757 for j in range(threadnum)]
shift = [j*simnum for j in range(simnum)
pool = multiprocessing.Pool(threadnum)
arguments = zip(shift,seed)
#spawn threadnum threads and give them parallel jobs
pool.map(parallel_job, iterable=arguments)
所以这个程序定义一个种子向量,产生一定数量的线程,为每个线程分配一个种子 . 然后使用该种子生成随机图,然后选择并打印10次随机选择的节点 .
我的问题是:
1)如果不是每个线程只生成一个图形而是我想生成m个不同的图形,我应该如何修改它?在生成每个图形之后,我应该用某种方法更改种子还是有一种betetr方式?是否有必要使用可选参数seed = seed调用networkx?我正在阅读NetworkX的文档,它可能使用全局随机生成器来做随机图,我有点担心
2)如果我把程序的一部分选择一个随机数的节点放在一个单独的函数中,并且我从代码的并行化部分调用它,它会使用“正确的”种子来随机化向量吗?
3)是否有更好的方法可以并行创建随机图,然后从种子(可能是用户给出的)开始在这些图上挑选随机节点?
我使用的是NetworkX 2.2版,numpy 1.15.4,python 2.7