Inside cpyext - Why emulating CPython C API is so Hard

查看原文

本文是 Pypy 更新的博文,探讨的是如何通过 cpyext 提升 Pypy 的 benchmark。

cpyext 是 Pypy 的组件,用于为 CPython C 插件运行在 Pypy 上提供兼容层。换句话说,在 C 插件中只要用到了 Python.h 这个依赖,那么在 Pypy 中其实就是在用 cpyext。现状是:cpyext 刚处于能用的状况,这些 C 插件运行在 Pypy 上其实比 CPython 还慢一些。

在 CPython 中,解释器使用的是引用计数,PyObject 对象分配在堆上。当引用降到 0 时可以被安全 free 掉。在 Pypy 中类似,所有对象都是 W_Root 的子类,但是在 Pypy 中其实使用的是 Generational GC。这意味着在做 C 插件编译的时候,Pypy 要去维护 PyObject 和 W_Root 的关系,这个是导致拖慢性能的地方 - C 跟 RPython 互转的地方是最慢的。Pypy 所做的努力是简化 cpyext , 减少 C - RPython 做类型转换的 round-trip time。 麻烦的地方在于简化 cpyext 需要对 C API 一个一个去做适配。