Python-python中 ** 运算符为什么比sqrt()函数效率高很多?

Python-python中 ** 运算符为什么比sqrt()函数效率高很多?

夜无邪 发布于 2017-02-28 字数 712 浏览 1296 回复 2

如下代码:python中**运算符的效率比sqrt()函数效率高出近一倍,为什么?

Python 2.6.6 (r266:84292, Dec  7 2011, 20:38:36) 
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from timeit import Timer as t
[0.1516878604888916, 0.15160799026489258, 0.15162897109985352]
>>> from math import sqrt
>>> t(lambda : sqrt(1234567890)).repeat()
[0.27185297012329102, 0.2753138542175293, 0.27170610427856445]
>>> t(lambda : 1234567890 ** 0.5).repeat()
[0.15108108520507812, 0.15106606483459473, 0.15106606483459473]
>>>

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晚风撩人 2017-09-17 2 楼

你的测试样本太简单了,不足以得出 * * 要比sqrt快的结论,只能说明在CPython2.6.6中,对1234567890这一个数字 * * 要比sqrt更快。或许这样的测试代码会更有说服力:

import time
import math

def test1():
start = time.time()
for i in xrange(100000):
z = i**.5
print "x**0.5 took %f secs" % time.time() - start

def test2(f=math.sqrt): # 不要在for*里面*用math.sqrt, 查询函数的时间可能使结果有误差
start = time.time()
for i in xrange(100000):
z = f(i)
print "x**0.5 took %f secs" % time.time() - start

另外,请在你需要的python解释器中测试,不同的解释器及版本结果都不同。这里有一些别人的测试结果。大体来说sqrt更快(CPython[2.4.6, 2.5.5, 2.6.6, 2.7, 3.0.1, 3.1.2], Pypy1.4.1, CPython[2.5, 2.6]+Psyco2.0), 只有在Jython2.5.1中**更快。

至于为什么。。* *(与pow函数等价)的参数可以是复数,所以额外的类型检查之类可能带来开销;而Guido说sqrt是直接连接到C中的sqrt函数的,所以会非常快。

晚风撩人 2017-06-03 1 楼

我在一本书上看到的调优技巧中有这么一段话 我就直接敲到这里

任何时候向对象或函数添加额外的抽象或便利层,都会降低程序的运行速度.但是,也需要在可用性与性能之间进行权衡.例如,添加额外层的总体目标通常是为了简化编码,这是不错的目标.
为了进行演示,我们给出个简单的例子,设想一个程序使用dict()函数来创建具有字符串键的字典
如下所示:

> s = dict(name="GOOG",shares=100,price=490.10)
> # s = {'name':'GOOG','shares':100,'price':490.10}
>

*程序员可能以这种方式创建字典来节省键入操作(无需在键名称两边添加引号).但是,这种创建字典的替代方法运行速度非常慢,因为他添加了额外的函数调用

摘自《Python参考手册第四版(中文)》160页

注意加粗部分..
奇怪 为啥预览和实际效果不一样呢!

补充一下 我的回答可能是错的 有一个前辈跟我说不同的运行环境结果也不一样 但是更具体的我就不知道了