问题描述
更模糊的Cython编译器选项之一是closure_freelist_size
,默认为8
。根据{{3}},这是
这是什么意思?什么样的代码可以通过更改(降低,我认为是)这个数字而受益(性能方面,甚至一点点)?
解决方法
Cython提供了一个@cython.freelist
装饰器,您可以将其应用于cdef class
:https://cython.readthedocs.io/en/latest/src/userguide/extension_types.html#fast-instantiation。它所做的假设是内存分配很慢,并且它所应用的类通常在任何时候都有一些寿命很短的实例。因此,它将为最多N
个类的实例不断分配内存,并在该内存中分配新实例(如果有)。它还假定您不会继承该类(因此所有分配的大小都相同)。
费用是
- 更高的基本内存使用率。
- 如果这些假设是错误的(例如,通常一次存在多个
N
个实例),那么大多数分配将无法利用自由列表,并且会有一些浪费时间来决定。
在内部,Cython将闭包(即在内部函数,生成器表达式,生成器等中捕获的变量)表示为cdef class
。 closure_freelist_size
选项将自由列表优化应用于这些闭包。对于大多数用例,它可能适用于这些用例,因为您通常不会同时存在单个发生器的大量实例。
如果不适用这些假设,则可能值得关闭,或者如果您有一个内部循环分配(例如)单个生成器的16个同时实例,那么可能值得增加。如果您没有太多使用闭包,那么可能就没关系了。