python的函数调用开销有那些?

python的函数调用会不会开辟新栈?

python函数是对象,这样的话是不是函数调用就直接pc指针跳一下就可以了?

如果python函数调用开销比c语言大,python又没有内联函数或者宏,那该如何优化函数调用的开销?

阅读 6.8k
3 个回答

Python函数调用对应的字节码是: CALL_FUNCTION, 这个过程包括了:

  1. 分析位置参数和关键参数

  2. 函数类型判断

  3. 提取函数对象的CodeObject

  4. 根据CodeObject判断是执行PyEval_EvalFrameEx 还是 PyEval_EvalCodeEx

但是不管最后结果怎样, 都会有个创建栈帧对象的动作: f = PyFrame_New(tstate, co...)
所以函数调用并不像你理解的 直接pc指针跳一下就可以, 这是个繁琐的步骤!

故, 与其纠结在函数调用这块的性能损失, 倒不如利用cProfile这类的性能分析库去分析真正的瓶颈, 因为在数据结构, 算法以及网络/磁盘IO等等,可优化的空间更大!

如果真的这么纠结, 那就别用函数吧, 直接一波代码说干就干(开玩笑~)

先做profile
然后才是去优化. 然后才是去看代码的逻辑结构.

一般函数调用都涉及到 返回栈的压栈 参数的压栈或者放入寄存器 函数返回时恢复相应的寄存器和栈

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题