首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效地使用图形工具

高效地使用图形工具
EN

Stack Overflow用户
提问于 2016-03-26 19:31:06
回答 2查看 3.4K关注 0票数 3

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

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

代码语言:javascript
复制
nbr = np.random.choice(list(v.all_neighbours()))

因为v.all_neighbours()是一个生成器,所以我必须将它转换为列表来选择一个随机元素。这会减慢代码的速度,但我看不出有什么更好的方法。

(2)我要赋值一个一维向量( list可以吗?)对于图中的每个顶点,稍后我将以一种特定的方式交换和修改它们。这是一个简单的属性映射,我希望看到一些关于如何有效地使用它的文档。但是,我找不到任何东西。

(3)我试图在某个网络中模拟一个随时间变化的三进闭包。因此,在每个时间步骤中,我都需要一个关于图中每个顶点的邻域的信息。同样,我必须创建一个列表(或numpy数组):

代码语言:javascript
复制
nbrs = [w for w in v.neighbours()]

这大大降低了我的代码速度。这意味着我做得不对,但我找不到任何文档来告诉我如何在图形工具中高效地使用邻居。

不知怎么的,我为相同任务编写的Networkx程序的性能完全超过了图形工具代码,我根本买不到这个。

这个列表可能会增加,因此,如果有人能向我介绍一些关于有效使用图形工具的文档,除了回答上面提到的具体问题之外,我会非常高兴。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-03 01:12:59

您可以以数组的形式访问邻居和顶点,这将加快代码的速度,如文档:https://graph-tool.skewed.de/static/doc/quickstart.html#fast-iteration-over-vertices-and-edges所述

例如,没有执行以下操作:

代码语言:javascript
复制
nbr = np.random.choice(list(v.out_neighbours()))

你应该这样做:

代码语言:javascript
复制
nbr = np.random.choice(g.get_out_neighbours(v))

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

票数 1
EN

Stack Overflow用户

发布于 2016-04-11 20:48:10

我将尝试做更多的"graph-tool-specific“的回答:

1)实际上,这个与python有关,因此您可能希望使用来自random.shuffle的解决方案,但是,如果您要重复使用这个解决方案(如果您有足够的可用内存),我认为最好将邻接矩阵作为scipy稀疏矩阵,然后使用该矩阵:

代码语言:javascript
复制
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_enabledopenmp_get_num_threadsopenmp_set_num_threadsgraph-tool中访问和更改openmp_set_num_threads线程的数量。但在医生身上找不到.但这是来源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36239913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档