2010-11-27 18 views
3

J'ai ce qu'est un dictionnaire Python de ~ 1000 entrées. Un script va être appelé à plusieurs reprises qui voudra analyser une chaîne et voir si des clés de la chaîne correspondent. Si c'est le cas, il faudra une action basée sur la clé et la valeur.Quel est le moyen le plus efficace pour charger un dictionnaire en Python?

Lequel de ces éléments est le plus rapide?

1) Stockez le dictionnaire dans une base de données MySQL, puis lisez la base de données à chaque appel du script.

2) Stockez le dictionnaire dans un script Python et importez-le à chaque fois. (par exemple créer un fichier qui ne contient que l'initialisation du dictionnaire)

3) Stockez le dictionnaire dans un fichier texte et importez-le à chaque fois. (soit un fichier de texte plat ou un fichier de données sérialisé pickle, en utilisant cpickle)

Vous cherchez simplement une meilleure pratique ici.

+0

Un dictionnaire d'entrée 1000 est pas grand. Si vous vous inquiétez du "temps de chargement", pourquoi ne pas simplement mettre votre dictionnaire dans un module python et l'importer une fois au début de votre application? Il sera compilé dans un fichier PYC et sera gentil et rapide après la première fois que vous l'exécutez, non? –

+0

Comme le dit K., votre dictionnaire est minuscule, donc vous devriez probablement le charger en mémoire dans un pyc. Cependant, pour les grands dictionnaires réels, vous devez utiliser une base de données comme BDB ou MetaKit, et non une base de données relationnelle. –

Répondre

1

Vous pouvez créer un fichier .py Python qui affecte simplement le dictionnaire à un nom. Enregistrez le fichier. Compilez le fichier en .pyc puis chargez-le en tant que module si nécessaire par votre script Python principal.

Vous avez l'avantage de conserver une représentation textuelle lisible de votre dict pour la maintenance/le débogage, la vitesse de chargement d'un fichier .pyc et la simplicité de tout cela étant du standard Python.

+1

Le fichier sera automatiquement compilé en .pyc la première fois qu'il est importé. – aaronasterling

0

Je pense que le stocker comme un dictionnaire dans un fichier python et l'importer dans chaque module qui en a besoin serait le chemin à parcourir. Pouvez-vous le construire par programmation? Quoi qu'il en soit, le fichier ne sera réellement importé qu'une seule fois par programme d'exécution, ce qui ne devrait pas être grave à moins de savoir que le charger une fois au début est inacceptable pour une raison quelconque.

shelve pourrait être une autre façon d'aller ici. Ce serait probablement le moyen de le faire si vous vouliez aller avec l'option (3) Il est construit sur le module anydbm. Cela sera probablement plus lent mais vous permettra d'éviter d'avoir tout cela en mémoire à la fois. À mon avis, 1) et 3) sont à droite. Le surcoût lié à l'interrogation de la base de données ralentirait considérablement l'accès. Option 2) fera tout une simple recherche dict.

0

Pour des fins de test, vous pouvez également charger un dictionnaire avec tout ce que (nombres entiers dans ce cas) comme ceci:

D = dict(zip(range(100),range(100)))