[英]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)阅读有关PropertyMaps
的graph-tool
文档和详细版本 , list
s被接受为python::object
或简单object
。 然后,您可以在PropertyMap
中将它们作为元素进行访问。
编辑:顺便说一句,我忘了提及它,但你可以使用graph-tool
openmp_enabled
, openmp_get_num_threads
和openmp_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.