经过很长时间的思考,我终于决定把这个问题发到这里。几天前,我开始使用graph-tool做各种事情。在此之前,我一直使用Networkx。我已经看到了令人印象深刻的性能比较,并认为一切都会很简单。但是,我立即遇到了速度问题,提出一个问题与它的一个特定方面有关。我得到了一个令我满意的快速回答。然而,现在这个速度问题不时地困扰着我,我找不到任何与高效使用graph-tool相关的文档。例如,从对我上一个问题的回答中,我意识到最好是把所有的边加在一起,而不是一个接一个地加在一起,这是一个非常重要的注意点,但没有被任何地方提及!我现在又有两个类似的问题:
(1)如何选择给定节点的随机邻居?我只能看到以下解决方案:
nbr = np.random.choice(list(v.all_neighbours()))因为v.all_neighbours()是一个生成器,所以我必须将它转换为列表来选择一个随机元素。这会减慢代码的速度,但我看不出有什么更好的方法。
(2)我要赋值一个一维向量( list可以吗?)对于图中的每个顶点,稍后我将以一种特定的方式交换和修改它们。这是一个简单的属性映射,我希望看到一些关于如何有效地使用它的文档。但是,我找不到任何东西。
(3)我试图在某个网络中模拟一个随时间变化的三进闭包。因此,在每个时间步骤中,我都需要一个关于图中每个顶点的邻域的信息。同样,我必须创建一个列表(或numpy数组):
nbrs = [w for w in v.neighbours()]这大大降低了我的代码速度。这意味着我做得不对,但我找不到任何文档来告诉我如何在图形工具中高效地使用邻居。
不知怎么的,我为相同任务编写的Networkx程序的性能完全超过了图形工具代码,我根本买不到这个。
这个列表可能会增加,因此,如果有人能向我介绍一些关于有效使用图形工具的文档,除了回答上面提到的具体问题之外,我会非常高兴。
提前谢谢。
发布于 2017-11-03 01:12:59
您可以以数组的形式访问邻居和顶点,这将加快代码的速度,如文档: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))这应该更快,因为数组被使用而不是列表。
发布于 2016-04-11 20:48:10
我将尝试做更多的"graph-tool-specific“的回答:
1)实际上,这个与python有关,因此您可能希望使用来自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)阅读PropertyMaps和详细版本,list被接受为python::object或简单的object。然后,您可以将它们作为PropertyMap中的元素访问。
3)对于三进闭包,请查看邮件列表中的聚类模块和这条线。
编辑:顺便提一下,我忘了提到它,但是您可以使用openmp_enabled、openmp_get_num_threads和openmp_set_num_threads在graph-tool中访问和更改openmp_set_num_threads线程的数量。但在医生身上找不到.但这是来源。
https://stackoverflow.com/questions/36239913
复制相似问题