使用指数**比math.sqrt效率低0.5?

Rob*_*ard 11 python exponentiation

引自" Python编程:计算机科学概论 "

我们可以使用取幂**取平方根.使用math.sqrt更有效.

"有点",但在多大程度上,以及如何?

sen*_*rle 16

从理论上讲,哈马尔的答案duffymo的答案都是很好的猜测.但实际上,在我的机器上,效率并不高:

>>> import timeit
>>> timeit.timeit(stmt='[n ** 0.5 for n in range(100)]', setup='import math', number=10000)
0.15518403053283691
>>> timeit.timeit(stmt='[math.sqrt(n) for n in range(100)]', setup='import math', number=10000)
0.17707490921020508
Run Code Online (Sandbox Code Playgroud)

部分问题是.操作.如果sqrt直接导入命名空间,则会略有改进.

>>> timeit.timeit(stmt='[sqrt(n) for n in range(100)]', setup='from math import sqrt', number=10000)
0.15312695503234863
Run Code Online (Sandbox Code Playgroud)

关键词:轻微.

进一步的测试表明,随着数量的增加,您从使用中获得的好处会sqrt增加.但仍然没有很多!

>>> timeit.timeit(stmt='[n ** 0.5 for n in range(1000000)]', setup='import math', number=1)
0.18888211250305176
>>> timeit.timeit(stmt='[math.sqrt(n) for n in range(1000000)]', setup='import math', number=1)
0.18425297737121582
>>> timeit.timeit(stmt='[sqrt(n) for n in range(1000000)]', setup='from math import sqrt', number=1)
0.1571958065032959
Run Code Online (Sandbox Code Playgroud)


Gar*_*ees 11

无需猜测实现,我们可以阅读代码!

math.sqrtsqrt标准C库的一个薄包装器:见mathmodule.c第956行

**运营商具有多个实现取决于类型的参数,但在一个浮点指数的情况下,它最终分派给pow从标准C库(见floatobject.c线783).

现代的CPU通常拥有一般幂例程不使用(比较和对比实现的特殊平方根指令powsqrtglibc中为x86-64的,例如).但是一旦添加了所有的解释器开销(字节码,类型检查,方法调度等),原始速度的差异并不重要,并且可以由诸如您是sqrt直接呼叫还是通过math模块(如其他答案中的时间所示).