Python库函数实现的浮点效率

5 投票
4 回答
1187 浏览
提问于 2025-04-16 01:04

我看到过很多关于球体碰撞检测的问题回答,解释了为什么平方根操作比较慢,为什么浮点数的绝对值操作比较快等等。我想知道怎么才能找出哪些操作是耗时的,哪些不是?

基本上,我在寻找一个资源,想了解所有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函数的运行速度,最好的办法就是看看源代码。

祝你玩得开心!

补充:这个建议其实适用于我接触过的任何开源项目:遇到问题了?看看源代码,通常就能找到解决办法。

撰写回答