我已经看到了球碰撞检测问题的各种答案,解释了为什么sqrt操作很慢,为什么绝对值操作在浮动字体上快速等等。我怎样才能找出哪些操作很昂贵而哪些不是?
基本上,我正在寻找一个可以了解所有python库函数实现的资源。当人们说这些东西时,他们实际上并没有考虑如何在C中实现这些东西吗?
谢谢,希望了解有关这种光滑语言的实施细节的更多信息。
答案 0 :(得分:1)
与任何语言一样,Python会转换为机器代码然后运行。所以是的,他们可能会讨论低级实现细节。
无论如何,了解各种Python函数的速度实现的最佳方法是taking a look in the source code.
玩得开心!
编辑:这个提示实际上适用于我使用的任何开源项目:遇到问题?看看源代码,你应该没问题。
答案 1 :(得分:1)
如果您正在寻找有关Python速度的提示,these performance tips是一个很好的资源。
答案 2 :(得分:1)
使用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 :(得分:0)
Python标准库包含a disassembler:
>>> def foo(): print
...
>>> import dis
>>> dis.dis(foo)
1 0 PRINT_NEWLINE
1 LOAD_CONST 0 (None)
4 RETURN_VALUE
但它并不适用于所有事情:
>>> from math import sqrt
>>> import dis
>>> dis.dis(sqrt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/dis.py", line 48, in dis
type(x).__name__
TypeError: don't know how to disassemble builtin_function_or_method objects