Bu yüzden en hızlı yolu elde etmek için bazı hız karşılaştırmaları yaptım. Liste anlamaları gerçekten çok hızlı. Yaklaşmanın tek yolu, listenin oluşturulması sırasında bayt kodunun dışlanmasını önlemektir. İlk denemem, prensipte daha hızlı görünen aşağıdaki yöntemdi:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(elbette 2 ** n uzunluğunda bir liste oluşturur) Bu yapı, zamana göre, hem kısa hem de uzun (bir milyon) listeler için liste anlayışından iki kat daha yavaştır.
İkinci girişimim, liste oluşturucuyu benim için çağırmak için starmap kullanmaktı, Liste yapıcısını en yüksek hızda çalıştıran görünen bir yapı var, ancak yine de daha yavaş, ancak yalnızca küçük bir miktar:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
Yeterince ilginç olan, yürütme süresi, yürütme süresi neredeyse tam olarak şunun hızına eşit olduğundan, starmap çözümünü yavaşlatan son liste çağrısı olduğunu gösteriyor:
l = list([] for _ in range(1<<n))
List (()) 'in de bir liste oluşturduğunu fark ettiğimde üçüncü denemem geldi, bu yüzden görünüşte basit olanı denedim:
l = list(map(list, [()]*(1<<n)))
ancak bu, starmap aramasından daha yavaştı.
Sonuç: hız manyakları için: Liste anlayışını kullanın. Gerekirse yalnızca işlevleri çağırın. Yerleşikleri kullanın.
d = [[] for x in xrange(0,n)]. Ya Python'da açıkça döngü yapmalısınız ya da bir Python işlevi / lambda'yı tekrar tekrar çağırmalısınız (bu daha yavaş olmalıdır). Ama yine de birinin yanıldığımı gösteren bir şey göndereceğini umuyorum :).