Согласно комментариям, я обновил код:
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()
Теперь функция math.sqrt
находится непосредственно в локальном аргументе, то есть имеет самый быстрый поиск.
ОБНОВЛЕНИЕ: Кажется, здесь важна версия Python. Раньше я думал, что timeit1
будет быстрее, так как, когда python анализирует «i **. 5», он синтаксически знает, какой метод вызывать (__pow__
или какой-либо вариант), поэтому он не должен проходить издержки поиска, которые делает вариант math.sqrt
. Но я могу ошибаться:
Python 2.5: 0.191000 против 0.224000
Python 2.6: 0.195000 против 0.139000
Также, похоже, психо справляется с math.sqrt
лучше:
Python 2.5 + Psyco 2.0: 0.109000 против 0.043000
Python 2.6 + Psyco 2.0: 0.128000 против 0.067000
| 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
Таблица результатов, полученных на машине:
$ 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
Воспроизвести результаты: