Python函数实现

时间:2010-07-09 20:57:23

标签: python performance implementation

我已经看到了球碰撞检测问题的各种答案,解释了为什么sqrt操作很慢,为什么绝对值操作在浮动字体上快速等等。我怎样才能找出哪些操作很昂贵而哪些不是?

基本上,我正在寻找一个可以了解所有python库函数实现的资源。当人们说这些东西时,他们实际上并没有考虑如何在C中实现这些东西吗?

谢谢,希望了解有关这种光滑语言的实施细节的更多信息。

4 个答案:

答案 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