python graph-tool访问顶点属性 [英] python graph-tool access vertex properties

查看:209
本文介绍了python graph-tool访问顶点属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于我当前的项目,我想使用图形工具库,因为它们声称是最快的: https ://graph-tool.skewed.de/performance .我有一些算法(最短路径等)可以在非常大的网络上运行,所以速度越快越好!

For my current project I want to use the graph-tool library since they claim being the fastest: https://graph-tool.skewed.de/performance. I have some algorithms (shortest path, etc.) to run on really large networks, so the faster the better!

第一个问题:这是最快"的说法吗? ;)

First question: Is this claim 'being the fastest' true? ;)

在尝试构建适合我需求的图形工具图形时,我发现无法以有效的方式访问顶点属性.也许我错过了什么?

While trying to build a graph-tool graph fitting my needs, I figured out that its not possible to access vertex properties in a efficient way. Maybe I missed something?

我的问题是,现在可以以更有效的方式编写函数"getVertexFromGraph(graph,position)"吗?或更广泛地说:我可以有效地检查顶点(由其position属性赋予)是否在图形中.

My question is now, can the function "getVertexFromGraph(graph, position)" be written in a more efficient way? Or more in general: Can I check efficiently if a vertex (given by its position property) is already in the graph or not.

提前谢谢!

import graph_tool as gt
#from graph_tool.all import *

edgeList = [[(0.5,1),(2.1,4.3)],[(2.1,4.3),(5.4,3.3)],[(5.4,3.3),(1.3,3.5)],[(4.4,3.3),(2.3,3.5)]] #A lot more coordinate values....

# Initialize the graph
routableNetwork = gt.Graph()

# Initialize the vertex property "position" to store the vertex coordinates
vpPosition = routableNetwork.new_vertex_property("vector<double>")
routableNetwork.vertex_properties["position"] = vpPosition

def getVertexFromGraph(graph, position):
    """
    This method checks if a vertex, identified by its position, is in the given graph or not.
    :param graph:       The graph containing all vertices to check  
    :param position:    The vertex/position to check
    :return:            The ID of the vertex if the vertex is already in the graph, 'None' otherwise
    """
    for v in graph.vertices():
        if graph.vp.position[v] == position:
            return v
    return None

def main():
    """
    This method creates the graph by looping over all given edges, inserting every: 
        - non existent vertex in the graph with its coordinates (property 'position')  
        - edge with its corresponding length (property 'distance')
    :return: -
    """
    for e in edgeList:
        vertex0 = getVertexFromGraph(routableNetwork,e[0])
        vertex1 = getVertexFromGraph(routableNetwork,e[1])
        if vertex0 == None:
            vertex0 = routableNetwork.add_vertex()
            routableNetwork.vertex_properties['position'][vertex0] = e[0]
        if vertex1 == None:
            vertex1 = routableNetwork.add_vertex()
            routableNetwork.vertex_properties['position'][vertex1] = e[1]

        edge = routableNetwork.add_edge(vertex0,vertex1)
        #routableNetwork.edge_properties['distance'][edge] = calculateDistance(e[0][0],e[0][1],e[1][0],e[1][1])

    #saveRoutableNetwork(routableNetwork)
    #graph_draw(routableNetwork, vertex_text=routableNetwork.vertex_index, vertex_font_size=18, output_size=(200, 200), output="two-nodes.png")

if __name__ == "__main__":
    main()

推荐答案

您要查找的功能是find_vertex():

https://graph-tool.skewed .de/static/doc/util.html#graph_tool.util.find_vertex

重要的是要意识到graph-tool通过卸载从性能敏感的循环到Python到C ++来达到其速度.因此,每当您像在代码中那样遍历顶点时,就会失去任何优势.

It is important to realize that graph-tool achieves its speed by off-loading performance-sensitive loops from Python to C++. So whenever you iterate through the vertices, like you did in your code, you lose any advantage.

还要注意,尽管find_vertex()是用C ++实现的,因此比纯Python中的等效速度快许多倍,但它仍然是O(N)操作.对于大型图形,最好创建一个良好的旧python字典,该字典将属性值映射到顶点,而查找成本为O(1).

Note also that, although find_vertex() is implemented in C++, and hence many times faster than the equivalent in pure Python, it is still an O(N) operation. For large graphs, you are better off creating a good old python dictionary that maps property values to vertices, which has an O(1) cost for lookup.

这篇关于python graph-tool访问顶点属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆