Python图形工具按索引高效访问顶点属性

时间:2017-11-02 17:51:24

标签: 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:
        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是Node类的python列表)。

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

  

graph-tool通过将主循环卸载到C ++来实现更高的性能

所以,我想知道如何在这种特定情况下卸载循环?图表工具对这种糟糕表现的解释是什么?

1 个答案:

答案 0 :(得分:2)

如果属性映射具有标量值,则应将属性映射作为数组访问:

idea {
    module {
        sourceDirs += file("out/production/classes/generated")
    }
}

这意味着你可以这样做:

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] 是Numpy整数数组。

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

Vertex

以上只是基本的Python优化。