[biblio-ref] add new route (pps-search) - #472
Conversation
|
Pour le nom du champ, j'ai demandé conseil, et voilà ce que j'ai eu comme réponse: Le terme
Le développeur a fait un choix sémantiquement ambigu : Voici mes recommandations, de la meilleure à la bonne :
Ma recommandation :
|
| def get_classes_for_doi(doi): | ||
| doi_lower = doi.lower() | ||
| return [classe for classe, dois in all_classes.items() if doi_lower in dois] |
There was a problem hiding this comment.
suggestion: 🟡 Performance : structure de données sous-optimale
La fonction get_classes_for_doi parcourt toutes les classes pour chaque DOI :
def get_classes_for_doi(doi):
doi_lower = doi.lower()
return [classe for classe, dois in all_classes.items() if doi_lower in dois]C'est O(n × m) où n = nombre de classes et m = DOIs par classe. Une structure inversée doi → set(classes) donnerait des recherches O(1) :
# csv2pickle-all.py — après avoir construit classes_dict
doi_to_classes = {}
for classe, dois in classes_dict.items():
for doi in dois:
doi_to_classes.setdefault(doi, set()).add(classe)
pickle.dump(doi_to_classes, file)Pour un dataset PPS de quelques milliers d'entrées, la différence est négligeable aujourd'hui, mais cela ne scale pas et le code est plus clair avec la structure inversée.
There was a problem hiding this comment.
En fait l'objet all_class n'est pas un json. C'est un dictionnaire d'ensemble, qui ressemble à :
{"label_1" : {"doi_1", "doi_2", ...}, "label_2": { ... }}
L'objectif était d'éviter la conversion de list en set à chaque appel. Le fichier a donc été sauvegardé sous cette forme.
Donc la complexité était bien de O(n) où n = nombre de classes (19 ici).
Mais inverser le dictionnaire est encore meilleur ! Je modifie le code en condéquence.
Je me pose plusieurs questions sur cette route :
Toute suggestion est la bienvenue !