在Python中更快:x ** .5或math.sqrt(x)?

问题:

我一直在想这一段时间。正如标题所说,哪个更快,实际功能还是简单地提高到半功率?
 UPDATE
这不是过早优化的问题。这只是底层代码实际工作的一个问题。 Python代码如何工作的理论是什么?
我发送Guido van Rossum一封电子邮件,因为我真的想知道这些方法的差异。

我的电子邮件:

在Python中至少有三种方法来做一个平方根:math.sqrt,’**’运算符和pow(x,.5)。我只是好奇,在执行每个这些差异。当谈到效率更好?

他的回应:

pow和**是等价的; math.sqrt不适用于复数,并链接到C sqrt()函数。至于哪一个更快,我不知道…

回答:

根据评论,我更新了代码:

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解析“我**。5”时,它在语法上知道哪个方法(__pow__或一些变体)),所以它不必经过查找math.sqrt变体的开销。但我可能错了:
 Python 2.5: 0.191000 vs. 0.224000
 Python 2.6: 0.195000与0.139000
psyco似乎更好地处理math.sqrt
 Python 2.5 + Psyco 2.0: 0.109000 vs. 0.043000
 Python 2.6 + Psyco 2.0: 0.128000 vs. 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

复制结果:

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Which is faster in Python: x**.5 or math.sqrt(x)?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

77 − 70 =