Python ile daha hızlı olan: x**.5 veya matematik.Karekök(x)?
Bir süredir bunu merak ediyordum. Başlığı daha hızlı, gerçek işlevi ya da sadece yarım güç topluyor ki? demek gibi
GÜNCELLEME
Bu erken optimizasyon meselesi değil. Bu sadece temel kod aslında nasıl çalıştığı hakkında bir soru. Python nasıl çalışır teorisi nedir?
Gerçekten bu yöntem farkları öğrenmek istedim Guido van Rossum neden bir e-posta gönderdim.
Benim e-posta:
Python Kare Kök yapmak için en az 3 yolu vardır: matematik.Karekök, '**' operatörü ve pow(x,.5). Farkı olarak sadece merak ediyorum bunların her biri uygulanması. Hangi verimlilik söz konusu olduğunda, daha mı iyi?
Onun cevabı:
pow ve ** eşdeğer; matematik.Karekök karmaşık sayılar için işe yaramaz ve C Karekök bağlantılar() işlevi. Hangisi olarak daha hızlı, hiçbir fikrim yok...
CEVAP
Yorumlar başı olarak, kodu güncelledik:
import time
import math
def timeit1():
s = time.time()
for i in xrange(750000):
z=i**.5
print "Took %f seconds" % (time.time() - s)
def timeit2(arg=math.sqrt):
s = time.time()
for i in xrange(750000):
z=arg(i)
print "Took %f seconds" % (time.time() - s)
timeit1()
timeit2()
Şimdi math.sqrt
işlevi doğrudan yerel bir değişken, hızlı arama mümkün yani.
GÜNCELLEME:Python sürüm burada sorun gibi görünüyor. Düşündüm o timeit1
daha hızlı olurdu, ne zamandan beri python ayrıştırır "ı**.5" o bilir, sözdizimsel, hangi yöntemi çağrısı (__pow__
ya da bazı varyasyon), bu yüzden gitmesi gerekmez yoluyla yük arama math.sqrt
varyant yok. Ama yanılıyor da olabilirim:
Python 2.5:0.224000 vs 0.191000
Python 2.6:0.139000 vs 0.195000
Ayrıca psyco görünüyor math.sqrt
daha iyi başa çıkmak için:
2.5 Psyco 2.0 Python:0.043000 vs 0.109000
2.6 Psyco 2.0 Python:0.067000 vs 0.128000
| Interpreter | x**.5, | sqrt, | sqrt faster, % |
| | seconds | seconds | |
|---------------- --------- --------- ----------------|
| Python 3.2rc1 | 0.32 | 0.27 | 19 |
| Python 3.1.2 | 0.136 | 0.088 | 55 |
| Python 3.0.1 | 0.155 | 0.102 | 52 |
| Python 2.7 | 0.132 | 0.079 | 67 |
| Python 2.6.6 | 0.121 | 0.075 | 61 |
| PyPy 1.4.1 | 0.083 | 0.0159 | 422 |
| Jython 2.5.1 | 0.132 | 0.22 | -40 |
| Python 2.5.5 | 0.129 | 0.125 | 3 |
| Python 2.4.6 | 0.131 | 0.123 | 7 |
# TBLFM: $4=100*($2-$3)/$3;%.0f
Tablo sonuçları makinede üretilen:
$ uname -vms
Linux #42-Ubuntu SMP Thu Dec 2 02:41:37 UTC 2010 x86_64
$ cat /proc/cpuinfo | grep 'model name' | head -1
model name : Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
Sonuçlar üretmek için:
- alın kaynak:
git clone git://gist.github.com/783011.git gist-783011
tox
yükleme:pip install tox
tox.ini
dosyası ile dizintox
çalıştırın.
Daha hızlı olan: birden fazla tek Ekle...
Python: neden * * * daha hızlı ve daha...
Daha hızlı olan : (bool) veya(int)?...
Çift.TryParse veya Dönüştürmek.Daha hı...
Neden Python kodunu daha hızlı bir işl...