J'ai donc fait des comparaisons de vitesse pour obtenir le moyen le plus rapide. La compréhension des listes est en effet très rapide. La seule façon de se rapprocher est d'éviter que le bytecode ne soit excusé lors de la construction de la liste. Ma première tentative a été la méthode suivante, qui semble en principe plus rapide:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(produit une liste de longueur 2 ** n, bien sûr) Cette construction est deux fois plus lente que la compréhension de la liste, selon le temps, pour les listes courtes et longues (un million).
Ma deuxième tentative a été d'utiliser starmap pour appeler le constructeur de liste pour moi.Il y a une construction, qui semble exécuter le constructeur de liste à la vitesse maximale, mais qui est toujours plus lente, mais seulement d'une infime quantité:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Assez intéressant, le temps d'exécution suggère que c'est l'appel final de la liste qui ralentit la solution starmap, car son temps d'exécution est presque exactement égal à la vitesse de:
l = list([] for _ in range(1<<n))
Ma troisième tentative est survenue lorsque j'ai réalisé que list (()) produisait également une liste, alors j'ai essayé la simplicité apparemment:
l = list(map(list, [()]*(1<<n)))
mais c'était plus lent que l'appel starmap.
Conclusion: pour les maniaques de vitesse: utilisez la compréhension de liste. N'appelez des fonctions que si vous le devez. Utilisez des fonctions intégrées.
d = [[] for x in xrange(0,n)]. Vous devez soit boucler explicitement en Python, soit appeler une fonction Python / lambda à plusieurs reprises (ce qui devrait être plus lent). Mais en espérant toujours que quelqu'un publiera quelque chose qui montre que je me trompe :).