Voici un extrait de code qui montre le code que je voudrais optimiser:Optimiser une compréhension de la liste
result = [(item, foo(item))
for item in item_list
if cond1(item) and cond2(foo(item))]
Dans l'extrait ci-dessus que j'appelle foo(item)
deux fois. Je ne peux pas penser à un moyen d'itérer sur la liste seulement une fois maintenir à la fois item
et foo(item)
pour le conditionnel et la liste de résultats.
C'est, je voudrais garder item
et foo(item)
sans avoir à faire deux fois la boucle sur la liste et sans avoir à appeler foo(item)
.
Je sais que je peux le faire avec une deuxième compréhension de la liste imbriquée:
result = [(item, foo_item)
for item, foo_item in [(i, foo(i)) for i in item_list]
if cond1(item) and cond2(foo_item)]
mais qui semble boucle à travers item_list
deux fois que je voudrais éviter.
Ainsi, le premier exemple appelle foo
deux fois par élément de liste. Le deuxième exemple parcourt deux fois la liste (ou apparaît). Je voudrais boucler une fois et appeler le foo
une fois pour chaque article.
Ce serait génial si vous pouviez tester la performance des différentes réponses et afficher les résultats ici. C'est un peu difficile pour quelqu'un d'autre de le faire sans connaître le temps de fonctionnement de 'cond1',' cond2' et 'foo' –