如何使带有 if 条件的 for 循环更快

How to make a for cycle with if conditions faster

我写了一段代码,但是 运行 需要花费大量时间,而且我不知道如何让它更快。谁能帮帮我?

代码如下:

import networkx as nx
import matplotlib.pyplot as plt
import osmnx as ox
import pandas as pd
from shapely.wkt import loads as load_wkt
import numpy as np
import matplotlib.cm as cm
ox.config(log_console=True, use_cache=True)
import matplotlib as mpl
import random as rd



distrito = ['Lisbon District', 'Setúbal District']
G = ox.graph_from_place(distrito, network_type='all_private')
hospitals = ox.pois_from_place(city, amenities=['hospital'])

coord_1 = (38.74817825481225, -9.160815118526642)  
coord_2 = (38.74110711410615, -9.152159572392323)  
coord_3 = (38.7287248180068, -9.139114834357233) 
target_1 = ox.get_nearest_node(G, coord_1)
target_2 = ox.get_nearest_node(G, coord_2)
target_3 = ox.get_nearest_node(G, coord_3)

nodes, edges = ox.graph_to_gdfs(G, nodes=True, edges=True)  # Transform nodes and edges into Geodataframes


travel_speed = 20  # km/h
meters_per_minute = travel_speed * 1000 / 60

nodes['shortest_route_length_to_target'] = 0
route_lengths = []
list_nodes = []
i = 0
# print(G.edges(data=True))
for u, v, k, data in G.edges(data=True, keys=True):

    data['time'] = data['length'] / meters_per_minute

for node in G.nodes:
    try:
        route_length_1 = nx.shortest_path_length(G, node, target_1, weight='time')
        route_length_2 = nx.shortest_path_length(G, node, target_3, weight='time')
        if route_length_1 < route_length_2:
            route_lengths.append(route_length_1)
            nodes['shortest_route_length_to_target'][node] = route_length_1
            list_nodes.append(node)
        elif route_length_1 > route_length_2:
            route_lengths.append(route_length_2)
            nodes['shortest_route_length_to_target'][node] = route_length_2
            list_nodes.append(node)

    except nx.exception.NetworkXNoPath:
        continue

一般来说 for node in G.nodes: 之前的代码 运行 速度相当快。就是这个 for 周期太长了

提前谢谢你。

您应该分析您的代码以准确识别缓慢的地方。我非常自信地假设这不是您在 for 循环中的 if 条件(尽管它们可以进一步优化)。看起来几乎所有的时间复杂度都来自尝试解决每个 for 循环 运行 中的两条最短路径。这本来就很慢。

您可以尝试使用 igraph 之类的方法计算最短路径,这样会更快。

另请注意,从 OSMnx v0.13.0 开始,您无需手动计算 edge traversal times