有没有办法在python中“调用函数”而不引起通常的性能损失?

2024-04-19 03:45:38 发布

您现在位置:Python中文网/ 问答频道 /正文

Captain Hindsight, reporting in:

After reading through the comment and answer and running a few tests, I found out that I had made a subtle error in my calculations. Turns out, I was comparing compiled lookups to interpreted calls. When I precompiled the call using the NON-IPython line magic version ( ie: timeit.timeit(codestr, setup_codestr), I found that the function calls were indeed on the same order of magnitude as the lookups :)

Now there's a whole world of caching function results, precompiling functions, and precompiling types to explore! ..and that's nice :)

For posterity:

我意识到这听起来是个奇怪的问题,但也许有人知道解决这个问题的方法,那就太好了。接下来是:

如果我这样做:

%%timeit somelist[42]

然后我得到90纳秒范围内的时间。吃一片就可以达到190磅了;而且,令我惊喜的是,即使是大块头的疯子也跑得很快。例如,这个坏男孩的体重为385纳秒:

%%timeit some_nested_list[2:5][1][6:13]

事情是这样的。函数调用似乎要慢得多。我喜欢从函数的角度来分解问题,我开始对函数编程进行更多的思考,但是速度上的差异是显著的(3.34微秒vs 100-150纳秒(条件的实际平均值,等等))。以下需要3.34微秒:

def func():
    some_nested_list[2:5][1][6:13]
%%timeit func()

那么,大概有很多函数式程序员?你们一定都解决了这个小问题吧?有人能给我指出正确的方向吗?你知道吗


Tags: andoftheto函数inthatfunction
1条回答
网友
1楼 · 发布于 2024-04-19 03:45:38

不是真的。Python函数调用在设置堆栈帧等方面涉及一定的开销,在编写Python函数时不能消除这种开销。您的示例中的操作之所以快速,是因为您在一个列表上执行这些操作,而列表是用C编写的

需要记住的一点是,在许多实际情况下,相对于函数实际执行的操作,函数调用开销很小。有关一些讨论,请参见this question。但是,如果您转向纯函数样式,其中每个函数只对一个表达式求值,那么您可能确实会受到性能损失。你知道吗

另一种方法是看PyPy,它使许多纯Python操作更快。我不知道它是否特别提高了函数调用速度。另外,通过使用PyPy,可以限制可以使用的库集。你知道吗

最后,还有Cython,它允许您用一种看起来与Python基本相同的语言编写代码,但实际上可以编译为C语言。在某些情况下,这可能比Python快得多。你知道吗

归根结底,如何加速函数取决于函数实际执行的操作。没有什么神奇的方法可以让所有函数调用都变快,同时保持Python的所有其他功能不变。如果有的话,他们可能已经把它添加到Python中了。你知道吗

相关问题 更多 >