2012-03-22 19 views
31

benim makinede aşağıdaki sonuçları elde edersiniz: Bu int/uzun dönüşüm ile ilgili bir şey olabileceğini düşündümNeden math.factorial Python 2.x 3.x'den daha yavaş?

Python 3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import timeit 
>>> timeit.timeit('factorial(10000)', 'from math import factorial', number=100) 
1.9785256226699202 
>>> 

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import timeit 
>>> timeit.timeit('factorial(10000)', 'from math import factorial', number=100) 
9.403801111593792 
>>> 

ancak factorial(10000L) daha hızlı 2.7'de değildir.

+0

10.000! - Bu numara ne kadar büyük olduğunu biliyor musun? http://gimbo.org.uk/texts/ten_thousand_factorial.txt – duffymo

+7

@duffymo Bu, hız farkını açıklamıyor –

+0

Açıklamaya çalışmıyorum. Sadece OP'nin farkında olup olmadığını merak ediyorum, hepsi bu. int/long dönüşüm pek alakalı görünmüyor. Cevabın nerede, isbadawi? – duffymo

cevap

43

Python 2 naive factorial algorithm kullanır:

1121 for (i=1 ; i<=x ; i++) { 
1122  iobj = (PyObject *)PyInt_FromLong(i); 
1123  if (iobj == NULL) 
1124   goto error; 
1125  newresult = PyNumber_Multiply(result, iobj); 
1126  Py_DECREF(iobj); 
1127  if (newresult == NULL) 
1128   goto error; 
1129  Py_DECREF(result); 
1130  result = newresult; 
1131 } 

Python 3 divide-and-conquer factorial algorithm kullanır:

 
1229 * factorial(n) is written in the form 2**k * m, with m odd. k and m are 
1230 * computed separately, and then combined using a left shift. 

tartışma için Python Bugtracker issue bakınız. Bunu belirtmek için teşekkürler DSM.

+11

Tartışma için http://bugs.python.org/issue8692 adresine bakın. – DSM

+0

İlginç bir şekilde ve ne yazık ki ne yazık ki, görünüşe göre, Python 2.x'te C, 'math.factorial'da uygulanmasına rağmen, saf Python'da sadece bir '' '' için döngüden çok daha hızlı görünmüyor. Python uzun tamsayılarını kullanmanın ek yükü C'deki döngüden ne kazanırsa yenir gibi görünüyor. Bağlantılı Python bugtracker dizisinde yorumlandığı gibi, eğer gerçekten bu tür bir performans için performans istiyorsanız, 'gmpy' yi kullanın. –

+0

@JohnY Seçtiğiniz algoritmanın ötesinde hangi uygulamayı seçtiğinizden emin değilim. Saf kod algoritması ile iyi bir performans elde etmek imkansızdır, ister montajda elle kodlayın ya da yüksek düzeyde bir dilde yazın. – agf

İlgili konular