Python图形工具通过索引高效地访问顶点属性

Python图形工具通过索引高效地访问顶点属性,python,optimization,graph,scikit-learn,graph-tool,Python,Optimization,Graph,Scikit Learn,Graph Tool,我有一个顶点索引列表,我需要得到相应的顶点属性。我可以通过以下代码来实现这一点: [graph.vp["label"][ graph.vertex(i) ] for i in indices] 它工作得很好,但是我能完全避免python循环以获得更好的速度吗 我问这个问题的原因是我发现这段代码比另一段完全在python数据结构上编写的代码慢得多。例如,这就是我正在做的: for t in range(args.num_trials): for b in budget:

我有一个顶点索引列表,我需要得到相应的顶点属性。我可以通过以下代码来实现这一点:

[graph.vp["label"][ graph.vertex(i) ] for i in indices]
它工作得很好,但是我能完全避免python循环以获得更好的速度吗

我问这个问题的原因是我发现这段代码比另一段完全在python数据结构上编写的代码慢得多。例如,这就是我正在做的:

for t in range(args.num_trials):
    for b in budget:
        train, test = train_test_split(n, train_size=b, random_state=t)
        y_true = [graph.vp["label"][ graph.vertex(t) ] for t in test]
其中“图形”是图形工具图形对象。另一方面,下面是另一段代码:

for t in range(args.num_trials):
    for b in budget:
        train, test = train_test_split(n, train_size=b, random_state=t)
        y_true = [graph.node_list[t].label for t in test]
其中,图是一个自定义定义的python类,由基本python数据结构组成(例如,node_list是节点类的python列表)

这里的问题是,后面的代码比第一个运行得快得多。在我的机器中,第一个平均需要7秒左右,而后一个只需要0.07秒。除了最后一行之外,这两个代码段的其他所有内容都是相同的。我发现作者提到

图形工具通过将主循环卸载到C来实现更高的性能++


所以,我想知道在这个特定场景中如何卸载循环?图形工具性能不佳的原因是什么?

如果属性映射具有标量值,则应以数组的形式访问属性映射:

label = g.vp["label"]
la = label.a          # returns an array view
print(la[50])         # label for vertex 50
这意味着您可以:

label = g.vp["label"]
for t in range(args.num_trials):
    for b in budget:
        train, test = train_test_split(n, train_size=b, random_state=t)
        y_true = label.a[test]
假设上面的
test
是一个整数的Numpy数组

如果值类型是字符串,则无法访问数组。相反,您可以通过存储属性映射(而不是每次都在
g.vp
字典中搜索它们)和使用索引(而不是
Vertex
对象)来加快查询速度,即

label = g.vp["label"]
for t in range(args.num_trials):
    for b in budget:
        train, test = train_test_split(n, train_size=b, random_state=t)
        y_true = [label[t] for t in test]
以上只是基本的Python优化