2 votes

Accélérer une boucle en Python

J'exécute une boucle qui calcule un networkx.classes.multidigraph.MultiDiGraph pour chaque ligne (quartier) d'une liste de GeoDataFrames (villes). Il calcule ensuite quelques statistiques pour chaque ligne et écrit le fichier sur le disque. Le problème est que la boucle est extrêmement longue à calculer car le graphique est calculé pour chaque ligne. Je cherche un moyen d'accélérer la boucle.

J'ai essayé de calculer le graphique pour chaque complet GeoDataFrame avant de l'écrêter aux limites du voisinage, mais je ne connais pas de méthode pour écrêter les graphiques Networkx.

Voici mon code initial, qui prend 95 secondes :

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())

Comment pourrais-je accélérer ma boucle ?

0voto

Ben Mann Points 113

La réponse était en effet de calculer le graphe pour chaque ville avant de le découper en fonction des polygones de voisinage. Ceci a été suggéré par @gboeing dans sa réponse à la question suivante cette question .

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))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X