Então, fiz algumas comparações de velocidade para obter o caminho mais rápido. As compreensões de listas são realmente muito rápidas. A única maneira de chegar perto é evitar que o bytecode seja executado durante a construção da lista. Minha primeira tentativa foi o seguinte método, que parece ser mais rápido em princípio:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(produz uma lista de comprimento 2 ** n, é claro) Esta construção é duas vezes mais lenta do que a compreensão da lista, de acordo com o tempo, para listas curtas e longas (um milhão).
Minha segunda tentativa foi usar o starmap para chamar o construtor de lista para mim. Há uma construção, que parece executar o construtor de lista em alta velocidade, mas ainda é mais lento, mas apenas por uma pequena quantidade:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Curiosamente, o tempo de execução sugere que é a chamada de lista final que torna a solução do mapa estelar lenta, já que seu tempo de execução é quase exatamente igual à velocidade de:
l = list([] for _ in range(1<<n))
Minha terceira tentativa veio quando percebi que list (()) também produz uma lista, então tentei o aparentemente simples:
l = list(map(list, [()]*(1<<n)))
mas isso foi mais lento do que a chamada do mapa estelar.
Conclusão: para os maníacos por velocidade: Use a compreensão de lista. Apenas chame funções, se for necessário. Use builtins.
d = [[] for x in xrange(0,n)]. Você precisa fazer um loop explicitamente no Python ou chamar uma função / lambda do Python repetidamente (que deve ser mais lenta). Mas ainda espero que alguém poste algo que mostre que estou errado :).