Więc zrobiłem kilka porównań prędkości, aby uzyskać najszybszą drogę. Rozumienie listy jest rzeczywiście bardzo szybkie. Jedynym sposobem na zbliżenie się jest uniknięcie wykonania kodu bajtowego podczas tworzenia listy. Moja pierwsza próba była następująca, która wydawałaby się w zasadzie szybsza:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(oczywiście tworzy listę o długości 2 ** n) Konstrukcja ta jest dwa razy wolniejsza niż rozumienie list według timeit, zarówno dla krótkich, jak i długich (milion) list.
Moją drugą próbą było użycie starmap do wywołania konstruktora listy za mnie.Istnieje jedna konstrukcja, która wydaje się uruchamiać konstruktor listy z maksymalną prędkością, ale nadal jest wolniejsza, ale tylko o niewielką wartość:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Co ciekawe, czas wykonania sugeruje, że to ostatnie wywołanie listy spowalnia rozwiązanie Starmap, ponieważ jego czas wykonania jest prawie dokładnie równy szybkości:
l = list([] for _ in range(1<<n))
Moja trzecia próba nastąpiła, gdy zdałem sobie sprawę, że lista (()) również tworzy listę, więc wypróbowałem pozornie proste:
l = list(map(list, [()]*(1<<n)))
ale to było wolniejsze niż sygnał gwiezdny.
Wniosek: dla maniaków prędkości: używaj rozumienia listy. Wywołaj funkcje tylko, jeśli musisz. Użyj wbudowanych.
d = [[] for x in xrange(0,n)]. Musisz albo wykonać pętlę jawnie w Pythonie, albo wielokrotnie wywoływać funkcję / lambdę Pythona (co powinno być wolniejsze). Ale wciąż mam nadzieję, że ktoś opublikuje coś, co pokazuje, że się mylę :).