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