Python库函数实现的浮点效率
我看到过很多关于球体碰撞检测的问题回答,解释了为什么平方根操作比较慢,为什么浮点数的绝对值操作比较快等等。我想知道怎么才能找出哪些操作是耗时的,哪些不是?
基本上,我在寻找一个资源,想了解所有Python库函数的实现细节。当人们说这些话的时候,他们其实并没有考虑这些东西是怎么用C语言实现的,对吧?
谢谢,我想更多地了解这个流行语言的实现细节。
4 个回答
1
如果你想了解一些关于Python速度的建议,可以看看这些性能小贴士,它们是个不错的参考。
2
你可以通过使用 timeit 模块来找出哪些操作比较慢,哪些操作比较快。
举个例子,我们来比较一下检查一个点是否在圆内的不同方法,直接在命令行中进行:
python -m timeit -s 'import math; x = 42.5; y = 17.2; r = 50.0' 'math.sqrt(x**2 + y**2) <= r'
python -m timeit -s 'import math; x = 42.5; y = 17.2; r = 50.0' 'math.hypot(x, y) <= r'
python -m timeit -s 'import math; x = 42.5; y = 17.2; r = 50.0' 'x**2 + y**2 <= r**2'
在我的电脑上,结果是:
$ python -m timeit -s 'import math; x = 42.5; y = 17.2; r = 50.0' 'math.sqrt(x**2 + y**2) <= r' 1000000 loops, best of 3: 0.744 usec per loop $ python -m timeit -s 'import math; x = 42.5; y = 17.2; r = 50.0' 'math.hypot(x, y) <= r' 1000000 loops, best of 3: 0.374 usec per loop $ python -m timeit -s 'import math; x = 42.5; y = 17.2; r = 50.0' 'x**2 + y**2 <= r**2' 1000000 loops, best of 3: 0.724 usec per loop
所以 math.hypot
是最好的选择!顺便提一下,如果你在内部循环中去掉点号查找的部分,结果会稍微好一些:
$ python -m timeit -s 'from math import hypot; x = 42.5; y = 17.2; r = 50.0' 'hypot(x, y) <= r'
1000000 loops, best of 3: 0.334 usec per loop
3
Python就像其他编程语言一样,最终会被转换成机器代码,然后运行。所以,他们可能在讨论一些底层的实现细节。
想要了解各种Python函数的运行速度,最好的办法就是看看源代码。
祝你玩得开心!
补充:这个建议其实适用于我接触过的任何开源项目:遇到问题了?看看源代码,通常就能找到解决办法。