Mise à jour : Aplatissement en utilisant extend mais sans compréhension et sans utiliser la liste comme itérateur (le plus rapide)
Après avoir vérifié la réponse suivante qui proposait une solution plus rapide via une compréhension de liste avec l'option dual for
J'ai fait une petite modification et maintenant il fonctionne mieux, d'abord l'exécution de list(...) traînait un grand pourcentage de temps, puis le changement d'une compréhension de liste pour une boucle simple a également réduit un peu plus.
La nouvelle solution est :
l = []
for row in output: l.extend(row)
L'ancien remplaçant list
con []
(un peu plus lent mais pas beaucoup) :
[l.extend(row) for row in output]
Plus vieux (plus lent) :
Aplatissement avec compréhension des listes
l = []
list(l.extend(row) for row in output)
quelques timeits pour new extend et l'amélioration obtenue en supprimant simplement list(...) pour [...] :
import timeit
t = timeit.timeit
o = "output=list(zip(range(1000000000), range(10000000))); l=[]"
steps_ext = "for row in output: l.extend(row)"
steps_ext_old = "list(l.extend(row) for row in output)"
steps_ext_remove_list = "[l.extend(row) for row in output]"
steps_com = "[item for sublist in output for item in sublist]"
print(f"{steps_ext}\n>>>{t(steps_ext, setup=o, number=10)}")
print(f"{steps_ext_remove_list}\n>>>{t(steps_ext_remove_list, setup=o, number=10)}")
print(f"{steps_com}\n>>>{t(steps_com, setup=o, number=10)}")
print(f"{steps_ext_old}\n>>>{t(steps_ext_old, setup=o, number=10)}")
L'heure des résultats :
for row in output: l.extend(row)
>>> 7.022608777000187
[l.extend(row) for row in output]
>>> 9.155910597999991
[item for sublist in output for item in sublist]
>>> 9.920002304000036
list(l.extend(row) for row in output)
>>> 10.703829122000116