Skip to content

Commit

Permalink
opcode
Browse files Browse the repository at this point in the history
  • Loading branch information
HengHuH committed Jun 12, 2024
1 parent 8382432 commit 6fde5eb
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions _posts/2024-06-12-python-opcode.post
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>

0 comments on commit 6fde5eb

Please sign in to comment.