如何使带有 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。
我写了一段代码,但是 运行 需要花费大量时间,而且我不知道如何让它更快。谁能帮帮我?
代码如下:
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。