Cython closure_freelist_size 选项

The Cython closure_freelist_size option

一个比较晦涩的 Cython 编译器选项是 closure_freelist_size,它默认为 8。根据documentation,这是

number of function closure instances to keep in a freelist

这是什么意思?什么样的代码可以从改变(降低,我想)这个数字中受益(在性能方面,甚至一点点)?

Cython 提供了一个 @cython.freelist 装饰器,您可以将其应用于 cdef classes:https://cython.readthedocs.io/en/latest/src/userguide/extension_types.html#fast-instantiation。它所做的假设是内存分配很慢,并且它所应用的 class 通常在任何时候都有几个相当 short-lived 的实例。因此,它会为 class 的最多 N 个实例不断分配内存,并在可用时在该内存中分配新实例。它还假定您不会从 class 继承(因此所有分配的大小都相同)。

成本是

  1. 基本内存使用量稍高。
  2. 如果假设是错误的(例如,如果通常同时存在多于 N 个实例),那么大多数分配将无法利用空闲列表,并且会有浪费了一点时间来决定。

在内部,Cython 将闭包(即在内部函数、生成器表达式、生成器等中捕获的变量)表示为 cdef classes。 closure_freelist_size 选项将空闲列表优化应用于这些闭包。对于大多数 use-cases 它可能适用于这些,因为您通常不会同时存在大量的单个生成器实例。

如果假设不适用,那么它可能值得关闭,或者如果您有一个内部循环分配(比如说)单个生成器的 16 个同时实例,那么它可能值得打开。如果您不经常使用闭包,那么它可能并不重要。