繁体   English   中英

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

[英]Python graph-tool access vertex property by index efficiently

我有一个顶点索引列表,我需要为其获取相应的顶点属性。 我可以考虑通过以下代码来做到这一点:

[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秒。 除最后一行外,两个代码段的其他所有内容均相同。 我在这里发现作者提到,

graph-tool通过将主循环卸载到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优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM