Ускорение цикла в Python

Я запускаю цикл, который вычисляет networkx.classes.multidigraph.MultiDiGraph для каждой строки (окрестности) списка GeoDataFrames (городов). Затем он вычисляет некоторую статистику для каждой строки и записывает файл на диск. Проблема в том, что цикл очень длинный для вычисления, потому что график вычисляется для каждой строки. Я ищу способ ускорить цикл

Я попытался вычислить график для каждого полного GeoDataFrame, прежде чем обрезать его до границ соседства, но я не знаю, как обрезать графики Networkx.

Вот мой исходный код, который занимает 95 секунд:

import osmnx as ox
import pandas as pd
import geopandas as gpd
import os

path="C:/folder/"
files=[os.path.join(path, f) for f in os.listdir(path)]
merged=[]

for i in range(0,2):
    city=gpd.read_file(files[i])
    circ=[]

    for j in range(0,2):
        graph_for_row=ox.graph_from_polygon(city.geometry[j])
        #above is the long command
        stat = ox.basic_stats(graph_for_row)
        circ.append(stat['circuity_avg'])

    circ=pd.Series(circ)
    merged.append(pd.concat([city, circ], axis=1))

for k in (range(0,len(merged))):
    with open(geofiles[k], 'w') as f:
        f.write(merged[k].to_json())

Как я могу ускорить цикл?


person Ben Mann    schedule 17.02.2020    source источник
comment
@LarryLustig Я попытался свести все к сути этого вопроса и, возможно, сделал опечатку или непреднамеренно пропустил часть. Если я это сделал, пожалуйста, укажите это.   -  person Ben Mann    schedule 17.02.2020


Ответы (1)


Ответ действительно заключался в том, чтобы вычислить граф для каждого города, прежде чем обрезать его в соответствии с полигонами соседства. Это было предложено @gboeing в его ответе на этот вопрос .

city=gpd.read_file('C:/folder/file.geojson')
city_graph=ox.graph_from_polygon(city.unary_union, network_type='drive')
circ=[]

for j in (len(city)):
    intersecting_nodes = nodes[nodes.intersects(j)].index
    neighbourhood_graph = city_graph.subgraph(intersecting_nodes)
    stat = ox.basic_stats(neighbourhood_graph)
    circ.append(stat['circuity_avg'])

circ=pd.Series(circ)
merged.append(pd.concat([city, circ], axis=1))
person Ben Mann    schedule 23.02.2020