gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:28:41 27 4
gpt4 key购买 nike

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

[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]

其中“graph”是一个图形工具图形对象。另一方面,这是另一个代码片段:

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 achieves greater performance by off-loading main loops to 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优化。

关于Python图形工具通过索引有效地访问顶点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47081663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com