Поэтому я провел несколько сравнений скорости, чтобы выбрать самый быстрый способ. Составление списков действительно очень быстрое. Единственный способ приблизиться - это не допустить отключения байт-кода во время построения списка. Первой моей попыткой был следующий метод, который в принципе казался более быстрым:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(разумеется, производит список длиной 2 ** n) Это построение в два раза медленнее, чем понимание списка, согласно timeit, как для коротких, так и для длинных (миллион) списков.
Моя вторая попытка заключалась в том, чтобы использовать starmap для вызова конструктора списка для меня. Есть одна конструкция, которая, кажется, запускает конструктор списка на максимальной скорости, но все же медленнее, но только на крошечную величину:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Достаточно интересно, что время выполнения предполагает, что это последний вызов списка, который замедляет решение starmap, поскольку время его выполнения почти точно равно скорости:
l = list([] for _ in range(1<<n))
Моя третья попытка была предпринята, когда я понял, что list (()) также создает список, поэтому я попробовал на вид простой:
l = list(map(list, [()]*(1<<n)))
но это было медленнее, чем вызов карты звездного неба.
Вывод: для маньяков скорости: используйте понимание списка. Вызывайте функции только при необходимости. Используйте встроенные команды.
d = [[] for x in xrange(0,n)]. Вам нужно либо явно выполнить цикл в Python, либо повторно вызывать функцию Python / лямбда (что должно быть медленнее). Но все же надеюсь, что кто-то опубликует что-то, что показывает, что я неправ :).