Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有什么办法可以;调用函数";在python中不产生通常的性能影响?_Python_Python 3.x_Functional Programming - Fatal编程技术网

有没有什么办法可以;调用函数";在python中不产生通常的性能影响?

有没有什么办法可以;调用函数";在python中不产生通常的性能影响?,python,python-3.x,functional-programming,Python,Python 3.x,Functional Programming,船长事后诸葛亮,报告如下: 在阅读了评论和答案并进行了一些测试之后,我发现我在计算中犯了一个微妙的错误。事实证明,我是 比较编译的查找和解释的调用。当我预编译时 使用非IPython-line-magic版本(即: timeit.timeit(codestr,setup\u codestr),我发现函数调用 确实与查找的数量级相同:) 现在有一整套的缓存函数结果、预编译函数和预编译类型需要探索。。这很好:) 为子孙后代: 我意识到这听起来是个奇怪的问题,但有人可能知道解决这个问题的方法,那就太好

船长事后诸葛亮,报告如下:

在阅读了评论和答案并进行了一些测试之后,我发现我在计算中犯了一个微妙的错误。事实证明,我是 比较编译的查找和解释的调用。当我预编译时 使用非IPython-line-magic版本(即:
timeit.timeit(codestr,setup\u codestr)
,我发现函数调用 确实与查找的数量级相同:)

现在有一整套的缓存函数结果、预编译函数和预编译类型需要探索。。这很好:)

为子孙后代:

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

如果我这样做:

%%timeit somelist[42]
然后我得到90纳秒范围内的时间。一片就可以达到190ish;而且,令我惊喜的是,即使是大型的疯狂机器人也仍然跑得很快。例如,这个坏男孩的体重为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()

那么,大概有很多函数式程序员在那里?你们一定都解决了这个小问题?有人愿意为我指出正确的方向吗?

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

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

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

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


底线是,如何加速函数取决于函数的实际功能。没有什么神奇的方法可以让所有函数调用都变快,同时保持Python的其他一切不变。如果有的话,他们可能已经将其添加到Python中了。

如果您的函数采用参数,您可以安排将其备忘录化(即,一旦调用,结果将被缓存,并在后续调用中返回缓存的结果,但这仅在原始函数昂贵且函数不变的情况下才有帮助(即,相同的参数每次产生完全相同的结果)@TonySuffolk66非常感谢。它为我指明了正确的方向。是的,我不想发展一种纯粹的函数式风格,但对那些神圣探索的人毫无怨恨,哈哈。我的目标是在可分解性和速度之间取得平衡,但我不喜欢为了避免调用函数而必须编写多少代码。然而,我我发现我在计算中犯了一个微妙的错误。我正在比较编译的查找和解释的调用。当我使用非IPython magic版本(即:
timeit.timeit(codestr,setup\u codestr)
)预编译调用时,我发现函数调用的数量级确实相同:)