Diğer yanıtlayıcılar, bir üreteç ifadesi keşfettiğinizi söylerken haklıydılar (bu, liste anlayışlarına benzer, ancak etrafındaki köşeli parantezler olmadan bir gösterime sahiptir).
Genel olarak, geneksler (sevgiyle bilindikleri için) hafıza açısından daha verimli ve liste anlamalarından daha hızlıdır.
ANCAK, bu durumda ''.join()
, bir liste anlama hem daha hızlı hem de daha verimli hafıza. Bunun nedeni, birleştirme işleminin veriler üzerinde iki geçiş yapması gerektiğidir, bu nedenle aslında gerçek bir listeye ihtiyaç duyar. Bir tane verirseniz hemen işine başlayabilir. Bunun yerine bir genexp verirseniz, genexp'i tükenene kadar çalıştırarak bellekte yeni bir liste oluşturana kadar çalışmaya başlayamaz:
~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop
Aynı sonuç itertools.imap ile map karşılaştırılırken de geçerlidir :
~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop
join
büyük olasılıkla C'de yazıldığını ve bu nedenle bir liste anlamadan çok daha hızlı çalıştığını tahmin ediyorum ... Test süresi!