经过长时间的思考,我终于决定在这里发布这个问题了。几天前我开始使用graph-tool
做各种事情。我之前一直在使用Networkx
。我已经看到令人印象深刻的performance comparision,并认为一切都很简单。但是,我立即遇到速度问题,asked a question与其特定方面有关。我得到了一个让我满意的快速回答。但是,现在这个速度问题时不时地困扰着我,我找不到任何与有效使用它有关的graph-tool
文档。例如,从我上一个问题的答案,我开始意识到最好将所有边缘一起添加而不是一个一个,这是一个非常重要的注意事项,但在任何地方都没有提到过!我现在有两个类似的问题:
(1)如何选择给定节点的随机邻居?我只能看到以下解决方案:
nbr = np.random.choice(list(v.all_neighbours()))
由于v.all_neighbours()
是一个生成器,我必须将其转换为列表以选择随机元素。这会减慢代码速度,但我没有看到更好的方法。
(2)我想为图中的每个顶点分配1d向量(list
好吗?),之后我会以特定方式交换和修改它们。这只是一个属性映射,我想看一些有关如何有效使用它的文档。但是,我找不到任何东西。
(3)我试图在某个网络中模拟triadic closure,这个网络本身随时间而变化。因此,在每个时间步,我需要有关图中每个顶点的邻居的信息。同样,我必须创建一个列表(或numpy数组):
nbrs = [w for w in v.neighbours()]
大大降低了我的代码速度。这意味着我没有正确地执行此操作,但我找不到任何可以告诉我如何在图形工具中有效使用邻居的文档。
我为同样的任务编写的Networkx
程序完全胜过图表工具代码,我根本无法购买。
这个列表可能会增加,因此,如果有人能够指出我有关使用图形工具的一些文档,除了回答上述具体问题之外,我会很高兴。
提前致谢。
答案 0 :(得分:1)
我会尝试制作更多" graph-tool
- 具体"答案:
1)实际上这个与python有关,所以你可能想要使用this thread using random.shuffle
中的解决方案
但是,如果你要重复这样做,(如果你有足够的可用内存),我认为将邻接矩阵作为scipy
稀疏矩阵然后使用该矩阵可能会更好:
import graph_tool
from graph_tool.spectral import adjacency
import numpy as np
g = graph_tool.Graph()
g.add_vertex(100)
edges = np.random.randint(0, 100, (500,2))
g.add_edge_list(edges)
mat = adjacency(g).tolil()
rows = mat.rows.copy() # mat.rows = in-neighbours for each vertex
map(np.random.shuffle, rows)
rnd_neighbours = { i:row[0] for i, row in enumerate(rows) if row }
其中rnd_neighbours
包含非零度数的每个顶点的一个随机邻居的索引。
2)阅读graph-tool
documentation regarding PropertyMaps
和detailed version,list
被接受为python::object
或仅object
。然后,您可以将其作为PropertyMap
。
3)对于三元封闭,请查看邮件列表中的clustering module和this thread。
编辑:顺便说一句,我忘了提及它,但您可以在{{1}中使用openmp_enabled
,openmp_get_num_threads
和openmp_set_num_threads
访问和更改OpenMP主题的数量}。但是在文档中找不到它......但是这里是the source。
答案 1 :(得分:1)
您可以将邻居和顶点作为数组访问,这将加快您的代码速度,如文档中所述:https://graph-tool.skewed.de/static/doc/quickstart.html#fast-iteration-over-vertices-and-edges
例如,而不是:
nbr = np.random.choice(list(v.out_neighbours()))
你应该这样做:
nbr = np.random.choice(g.get_out_neighbours(v))
应该大大加快,因为使用数组而不是列表。