-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
20 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
--- | ||
title: Python 函数调用优化 | ||
date: 2024-06-12 | ||
--- | ||
|
||
<h1>Python 函数调用优化</h1> | ||
<p>现在我参与的项目中,使用 Python 作为业务开发语言。Python 层的框架里,实现了一套组件系统。可以将类型(Host)的逻辑和数据的代码拆分到不同的组件(Component)中,并在运行时将这些组件融合到 Host 中。 | ||
这样做,一方面可以将不同组件拆分到不同模块中,提高代码可读性,另外可以方便多人协作,负责某业务组件的同学只需关心相关的模块。</p> | ||
<p>类型的成员根据业务被划分到不同组件中,但有些生命周期函数,需要被拆分为多个小函数。例如 init 阶段,每个组件实现自己的 __init_component__。Host 会在运行时收集它所有组件的 __init_component__ 函数,在初始化阶段统一调用。当组件数量不多时,付出较小的运行时成本,可以获取到较多的工程收益。但是,随着项目的增长,Host 的 Component 数量增加,仅函数调用的成本就会变得不可忽略。每次调用 10 微妙,那么调用 100 次空函数,会有 1 毫秒。</p> | ||
<p>这些 Host 的生命周期函数都有相同的函数签名。需要找到一个方法,让多个函数签名相同的调用成本大幅降低。Python 的函数执行,是在 frame 中解释执行 bytecode。如果中把函数的 opcode 和它的执行环境合并,也就是把函数合并了,也就是把调用成本降低为一次。</p> | ||
|
||
<p>接下来介绍具体的实现,基于 Python 3.11 和之后的版本。之前的版本 opcode 和 bytecode 会有差别,但大体思路相同。</p> | ||
|
||
<p>先认识函数。</p> | ||
|
||
<p>运行时生成函数。</p> | ||
|
||
<p>看下字节码。运行时生成字节码。</p> | ||
|
||
<p>如何合并。</p> |