我在networkx中做一些复杂的计算。该计算涉及为网络中的每个节点一次又一次地计算一些数量。就像这样一个计算的例子,假设我们要计算网络中每个节点的平均邻居度,并将该值保存为节点属性。以下代码段对我有用:
import networkx as nx
G = nx.erdos_renyi_graph(10, 0.5)
def ave_nbr_deg(node):
value = 0.
for nbr in G.neighbors(node):
value += G.degree(nbr)
G.node[node]['ave_nbr_deg'] = value/len(G.neighbors(node))
for node in G.nodes():
ave_nbr_deg(node)
print G.nodes(data = True)
这给了我:
[(0, {'ave_nbr_deg': 5.4}), (1, {'ave_nbr_deg': 5.0}), (2, {'ave_nbr_deg': 5.333333333333333}), (3, {'ave_nbr_deg': 5.2}), (4, {'ave_nbr_deg': 5.6}), (5, {'ave_nbr_deg': 5.6}), (6, {'ave_nbr_deg': 5.2}), (7, {'ave_nbr_deg': 5.25}), (8, {'ave_nbr_deg': 5.5}), (9, {'ave_nbr_deg': 5.5})]
这里本身我有一个小小的疑问。对象 G 是在函数外部创建的ave_nbr_deg
,即使我没有声明它是全局的,我也不知道该函数是如何获得它的信息的。
现在,我想使用并行 python 模块来使用我系统上的所有内核进行此计算。对上述代码进行一些更改后,我得到以下代码:
import networkx as nx
import pp
G = nx.erdos_renyi_graph(10, 0.5)
def ave_nbr_deg(node):
value = 0.
for nbr in G.neighbors(node):
value += G.degree(nbr)
G.node[node]['ave_nbr_deg'] = value/len(G.neighbors(node))
job_server = pp.Server(ppservers = ())
print "Starting pp with", job_server.get_ncpus(), "workers"
for node in G.nodes():
job_server.submit(ave_nbr_deg, args = (node,))()
print G.nodes(data = True)
但它返回以下错误:
An error has occured during the function execution
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/ppworker.py", line 90, in run
__result = __f(*__args)
File "<string>", line 5, in ave_nbr_deg
NameError: global name 'G' is not defined
我尝试了各种各样的东西,包括nx
提交中的模块名称等等。但是,我没有得到确切的问题。不幸的是,smp 的文档太短,无法解决这个问题。如果这里有人可以帮助我,我将非常感激。
提前致谢