Quelle est la structure de données de graphe la plus efficace en Python ?

J'ai besoin d'être capable de manipuler un grand graphique (10^7 nœuds) en python. Les données correspondant à chaque nœud/arête sont minimales, disons, un petit nombre de chaînes. Quelle est la manière la plus efficace, en termes de mémoire et de vitesse, de procéder ?

Un dict de dicts est plus flexible et plus simple à mettre en œuvre, mais je m'attends intuitivement à ce qu'une liste de listes soit plus rapide. L'option de liste exigerait également que je garde les données séparées de la structure, tandis que les dicts permettraient quelque chose du genre :

graph[I][J]['Property']='value'

Que suggéreriez-vous ?

Oui, j'aurais dû être un peu plus clair sur ce que j'entends par efficacité. Dans ce cas particulier, je l'entends en termes de récupération d'accès aléatoire.

Le chargement des données dans la mémoire n'est pas un gros problème. C'est fait une fois pour toutes. La partie qui prend du temps consiste à visiter les nœuds afin que je puisse extraire les informations et mesurer les métriques qui m'intéressent.

Je n'avais pas envisagé de faire de chaque nœud une classe (les propriétés sont les mêmes pour tous les nœuds) mais il semble que cela ajouterait une couche supplémentaire de surcharge ? J'espérais que quelqu'un aurait une expérience directe avec un cas similaire qu'ils pourraient partager. Après tout, les graphes sont l'une des abstractions les plus courantes en CS.

请先 登录 后评论

2 réponses

Matthew Schinckel

La création d'une structure basée sur les classes aurait probablement plus de temps système que la structure basée sur les dicts, car dans les classes python, les classes utilisent en fait les dicts lorsqu'elles sont implémentées.

请先 登录 后评论
Peter Burns

Si je comprends bien, l'accès aléatoire est en temps constant pour les dicts et les listes de Python, la différence est que vous ne pouvez faire un accès aléatoire qu'aux index entiers avec des listes. Je suppose que vous devez rechercher un nœud par son étiquette, vous voulez donc un dict de dicts.

Cependant, sur le plan des performances, le charger en mémoire peut ne pas être un problème, mais si vous en utilisez trop, vous finirez par échanger sur le disque, ce qui tuera les performances même des dicts très efficaces de Python. Essayez de réduire autant que possible l'utilisation de la mémoire. De plus, la RAM est incroyablement bon marché en ce moment ; si vous faites souvent ce genre de choses, il n'y a aucune raison de ne pas avoir au moins 4 Go.

Si vous souhaitez des conseils pour réduire l'utilisation de la mémoire, donnez plus d'informations sur le type d'informations que vous suivez pour chaque nœud.

请先 登录 后评论