Python 高效地使用图形工具

Python 高效地使用图形工具,python,numpy,graph,networkx,graph-tool,Python,Numpy,Graph,Networkx,Graph Tool,经过深思熟虑,我终于决定把这个问题贴在这里。几天前,我开始使用图形工具做各种事情。在此之前,我一直在使用Networkx。我已经看到了令人印象深刻的,并认为一切都会很简单。然而,我立即遇到了速度问题,并涉及到它的一个特定方面。我很快得到了一个令我满意的答案。然而,现在这个速度问题时不时地困扰着我,我找不到任何关于graph tool的文档可以有效地使用它。例如,从我对上一个问题的回答中,我开始意识到最好将所有边添加在一起,而不是逐个添加,这是一个非常重要的注意点,但在任何地方都没有提到过!我现在

经过深思熟虑,我终于决定把这个问题贴在这里。几天前,我开始使用
图形工具
做各种事情。在此之前,我一直在使用
Networkx
。我已经看到了令人印象深刻的,并认为一切都会很简单。然而,我立即遇到了速度问题,并涉及到它的一个特定方面。我很快得到了一个令我满意的答案。然而,现在这个速度问题时不时地困扰着我,我找不到任何关于
graph tool
的文档可以有效地使用它。例如,从我对上一个问题的回答中,我开始意识到最好将所有边添加在一起,而不是逐个添加,这是一个非常重要的注意点,但在任何地方都没有提到过!我现在还有两个类似的问题:

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

nbr = np.random.choice(list(v.all_neighbours()))
由于
v.all_neights()
是一个生成器,因此我必须将其转换为列表以选择一个随机元素。这会减慢代码的速度,但我看不到任何更好的方法

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

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

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

不知何故,我为同样的任务编写的
Networkx
程序的性能完全超过了图形工具代码,我根本买不到这些

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

提前谢谢

我将尝试提供更多“
图形工具”
-特定的”答案:

1) 实际上,这是与python相关的,所以您可能希望使用 但是,如果要重复执行此操作(并且如果有足够的可用内存),我认为最好将邻接矩阵作为
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_neights
包含每个非零度顶点的一个随机邻居索引

2) 读取和,
列表
s被接受为
python::object
或只是
object
。然后,您可以将它们作为
PropertyMap
中的元素进行访问

3) 对于triadic Close,请查看邮件列表上的和


编辑:顺便说一下,我忘了提到它,但是您可以在
图形工具
中访问和更改启用
OpenMP\u
OpenMP\u get\u num\u threads
OpenMP\u set\u num\u threads
的OpenMP线程数。但是在文件里找不到它。。。但这里是。

您可以以数组的形式访问邻居和顶点,这将加快代码的速度,如文档中所述:

例如,不要执行以下操作:

nbr = np.random.choice(list(v.out_neighbours()))
你应该做:

nbr = np.random.choice(g.get_out_neighbours(v))

由于使用数组而不是列表,因此速度应该更快。

快速查看链接问题的公认答案,如果这是一个瓶颈,您似乎可以一次性添加边。可能不相关的OOP,因为我假设
networkx
there.Right。你对图形工具还有其他的想法吗?与我的预期相反,Networkx的工作速度相当快。这仅仅意味着我没有正确使用图形工具。我没有任何使用
图形工具的经验,事实上这是我第一次听说它。但如果他们声称它是有效的,我希望他们能有一些实现来匹配一次性添加所有边的功能,就像在
networkx
中一样。尽管如此,我还是亲自尝试了这个模块,看起来很有趣!这会引发错误:
AttributeError:“Vertex”对象没有属性“get_all_Neights”
@您可能正在使用旧版本。你需要升级。我正在使用今天升级到的2.26版。我使用的是Ubuntu 16.04。对不起,答案有误。我现在修复了。仍然抛出相同的错误。是因为我使用的是Ubuntu 16.04而不是最新的操作系统版本吗?
nbr = np.random.choice(g.get_out_neighbours(v))