Quindi ho fatto alcuni confronti di velocità per ottenere il modo più veloce. La comprensione delle liste è davvero molto veloce. L'unico modo per avvicinarsi è evitare che il bytecode venga eliminato durante la costruzione della lista. Il mio primo tentativo è stato il seguente metodo, che in linea di principio sembrerebbe più veloce:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(produce una lista di lunghezza 2 ** n, ovviamente) Questa costruzione è due volte più lenta della comprensione della lista, secondo timeit, sia per liste brevi che lunghe (un milione).
Il mio secondo tentativo è stato quello di utilizzare la mappa stellare per chiamare il costruttore dell'elenco per me, c'è una costruzione, che sembra eseguire il costruttore dell'elenco alla massima velocità, ma è ancora più lento, ma solo di una piccola quantità:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Abbastanza interessante il tempo di esecuzione suggerisce che è la chiamata finale della lista che rende lenta la soluzione starmap, poiché il suo tempo di esecuzione è quasi esattamente uguale alla velocità di:
l = list([] for _ in range(1<<n))
Il mio terzo tentativo è arrivato quando mi sono reso conto che list (()) produce anche un elenco, quindi ho provato l'apperentemente semplice:
l = list(map(list, [()]*(1<<n)))
ma questo era più lento della chiamata starmap.
Conclusione: per i maniaci della velocità: utilizzare la comprensione della lista. Chiama solo funzioni, se necessario. Usa incorporati.
d = [[] for x in xrange(0,n)]. Devi eseguire il loop esplicitamente in Python o chiamare ripetutamente una funzione / lambda Python (che dovrebbe essere più lento). Ma spero ancora che qualcuno pubblichi qualcosa che dimostri che ho sbagliato :).