繁体   English   中英

有效地使用图形工具

[英]Using a graph-tool efficiently

经过长时间的思考,我终于决定在这里发布这个问题。 几天前我开始使用graph-tool做各种事情。 我之前一直在使用Networkx 我已经看到了令人印象深刻的性能比较,并认为一切都很简单。 但是,我立即遇到速度问题并询问了与其特定方面有关的问题。 我得到了一个让我满意的快速回答。 但是,现在这个速度问题时不时地困扰着我,我找不到任何与有效使用它相关的graph-tool文档。 例如,从我上一个问题的答案,我开始意识到最好将所有边缘一起添加而不是一个一个,这是一个非常重要的注意事项,但在任何地方都没有提到过! 我现在有两个类似的问题:

(1)如何选择给定节点的随机邻居? 我只能看到以下解决方案:

nbr = np.random.choice(list(v.all_neighbours()))

由于v.all_neighbours()是一个生成器,我必须将其转换为列表以选择随机元素。 这会减慢代码速度,但我没有看到更好的方法。

(2)我想为图中的每个顶点分配1d向量( list好吗?),然后我以特定的方式交换和修改它们。 这只是一个属性映射,我想看一些有关如何有效使用它的文档。 但是,我找不到任何东西。

(3)我试图模拟某个网络中的三元闭包 ,这个网络本身随着时间而变化。 因此,在每个时间步,我需要有关图中每个顶点的邻居的信息。 同样,我必须创建一个列表(或numpy数组):

nbrs = [w for w in v.neighbours()]

这大大降低了我的代码速度。 这意味着我没有正确地执行此操作,但我找不到任何可以告诉我如何在图形工具中有效使用邻居的文档。

不知何故,我为同样的任务编写的Networkx程序完全胜过图表工具代码,我根本无法购买。

这个列表可能会增加,因此如果有人能够指出我有关使用图形工具的一些文档,除了回答上述具体问题之外,我会很高兴。

提前致谢。

我会尝试制作更多“ graph-tool特定”的答案:

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)阅读有关PropertyMapsgraph-tool文档详细版本list s被接受为python::object或简单object 然后,您可以在PropertyMap中将它们作为元素进行访问。

3)对于三元闭包,请查看聚类模块和邮件列表中的此线程

编辑:顺便说一句,我忘了提及它,但你可以使用graph-tool openmp_enabledopenmp_get_num_threadsopenmp_set_num_threads来访问和更改OpenMP线程的数量。 但是在文档中找不到它,但是......这里是源代码

您可以访问邻居和顶点作为数组,这将加速您的代码,如文档中所述: 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))

这应该大大加快,因为使用数组而不是列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM