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]
其中 "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 class 包含基本 python 数据结构(例如 node_list 是一个 python 节点列表 class).
这里的问题是,后面的代码比第一个运行得快得多。第一个平均需要 7 秒左右,而后一个在我的机器上只需要 0.07 秒。除最后一行外,这两个代码片段的其他所有内容都相同。我发现 作者提到,
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优化。
我有一个顶点索引列表,我需要为其获取相应的顶点属性。我可以想到通过以下代码来做到这一点:
[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 class 包含基本 python 数据结构(例如 node_list 是一个 python 节点列表 class).
这里的问题是,后面的代码比第一个运行得快得多。第一个平均需要 7 秒左右,而后一个在我的机器上只需要 0.07 秒。除最后一行外,这两个代码片段的其他所有内容都相同。我发现
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优化。