Cythonclosure_freelist_size选项

问题描述

更模糊的Cython编译器选项之一是closure_freelist_size认为8。根据{{​​3}},这是

要保留在空闲列表中的函数关闭实例的数量

这是什么意思?什么样的代码可以通过更改(降低,我认为是)这个数字而受益(性能方面,甚至一点点)?

解决方法

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

费用是

  1. 更高的基本内存使用率。
  2. 如果这些假设是错误的(例如,通常一次存在多个N个实例),那么大多数分配将无法利用自由列表,并且会有一些浪费时间来决定。

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

如果不适用这些假设,则可能值得关闭,或者如果您有一个内部循环分配(例如)单个生成器的16个同时实例,那么可能值得增加。如果您没有太多使用闭包,那么可能就没关系了。