2016-06-13 18 views
6

Bu örnekleri resmi belgelerden aldım.Kibrit fonksiyonuna göre jeneratör kavrama hızına benzer liste

Tam olarak ilk örneği (jeneratör ifadesi) ikinci saniyeden daha yavaş yapan nedir (liste kavraması)? Zaten bir liste veya tuple eğer

>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 
0.8187260627746582 
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 
0.7288308143615723 
+0

Ray Hettinger'in yanıtına bakın http://stackoverflow.com/questions/9060653/list-comprehension-without-python –

+0

@BhargavRao - Raymond'un cevabının bu soruyu ele aldığına katılıyorum, ancak bu soru temelde _that_'den farklıdır. soru. (Burada OP, liste-comp'in neden daha hızlı olduğunu bilmek ister - Diğer bir soruda, OP bir jeneratör ya da liste-comp arasındaki farkı bile bilmiyordu ...). Sanırım, bu gibi davalarda dupe-çekiç aşağı çekmek için politikanın ne olduğundan emin değilim ... – mgilson

+1

@mgilson Diğer soru bu sorunun süper kümesidir. Metada, daha geniş bir sorunun kopyasını kapatmak için oy verebileceğimizi belirten bir yayın vardı. Örneğin, kapanış gibi * bunu bir liste kavramasına * nasıl dönüştürürüm * bir liste listesi nedir, nasıl çalışır *. Ops'a yardım etmek için daha geniş sorular oluşturma girişimleri var ([top] 'a bir göz atın (http://sopython.com/canon/)). Sonuç olarak, eğer belli bir soru başka bir yerde cevaplanmışsa, o zaman dupe olarak kapanırız. (Ben normal cevap yerine çekiçler için * tam dupe * olduğunu belirten açıklamaya karşıyım) –

cevap

9

str.join yöntem listeye onun iterable parametreyi dönüştürür. Bu, birleştirme mantığının öğeler üzerinde birden çok kez yinelenmesini sağlar (sonuç dizgisinin boyutunu hesaplamak için bir geçiş yapar, daha sonra verileri kopyalamak için ikinci bir geçiş yapar).

Sen the CPython source code bu görebilirsiniz:

PyObject * 
PyUnicode_Join(PyObject *separator, PyObject *seq) 
{ 
    /* lots of variable declarations at the start of the function omitted */ 

    fseq = PySequence_Fast(seq, "can only join an iterable"); 

    /* ... */ 
} 

C API PySequence_Fast fonksiyon ı tarif sadece onu yapar. Zaten bir liste veya tuple olmadığı sürece, isteğe bağlı olarak yinelenebilir bir listeye (temelde list numaralı telefonu arayarak) dönüştürür.

Jeneratör ifadesinin bir listeye dönüştürülmesi, jeneratörler için olağan yararların (daha küçük bir bellek alanı ve kısa devre yapma potansiyeli) str.join'a ve dolayısıyla (küçük) ek yüke uygulanmadığı anlamına gelir. Jeneratör, performansını daha da kötüleştirdi.

İlgili konular