Así que hice algunas comparaciones de velocidad para conseguir la forma más rápida. Las comprensiones de listas son realmente muy rápidas. La única forma de acercarse es evitar que el código de bytes se ejecute durante la construcción de la lista. Mi primer intento fue el siguiente método, que parecería ser más rápido en principio:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(produce una lista de longitud 2 ** n, por supuesto) Esta construcción es dos veces más lenta que la comprensión de la lista, según timeit, tanto para listas cortas como largas (un millón).
Mi segundo intento fue usar el mapa de estrellas para llamar al constructor de listas por mí.Hay una construcción, que parece ejecutar el constructor de listas a máxima velocidad, pero aún es más lento, pero solo en una pequeña cantidad:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Es bastante interesante que el tiempo de ejecución sugiere que es la última llamada a la lista la que hace que la solución de mapa estelar sea lenta, ya que su tiempo de ejecución es casi exactamente igual a la velocidad de:
l = list([] for _ in range(1<<n))
Mi tercer intento llegó cuando me di cuenta de que list (()) también produce una lista, así que probé lo aparentemente simple:
l = list(map(list, [()]*(1<<n)))
pero esto fue más lento que la llamada del mapa estelar.
Conclusión: para los maníacos de la velocidad: use la lista de comprensión. Solo llame a funciones, si es necesario. Utilice incorporados.
d = [[] for x in xrange(0,n)]. Debe realizar un bucle explícito en Python o llamar a una función / lambda de Python repetidamente (lo que debería ser más lento). Pero aún espero que alguien publique algo que demuestre que estoy equivocado :).