如何将装饰器应用于Cython cpdef函数

如何将装饰器应用于Cython cpdef函数,第1张

如何将装饰器应用于Cython cpdef函数


,您无法轻松编写

cdef
函数的装饰器。装饰器
cdef
函数需要
cython.boundscheck
控制Cython代码生成而不是用户生成的函数。

cdef
函数与
def
函数之间的主要区别在于,
cdef
函数具有C接口,而
def
函数变为可调用的Python,因此可以从Python使用(但调用它的效率稍低,因为必须根据PyObjects传递参数)
。[ a和函数的内部 都是 由Python编译的,因此唯一的性能差异来自调用开销]
cdef``def

装饰器的通常用法是采用任意可调用的Python并对其进行一些修改。例如

def plus_one(f):    def wrapper(*args,**kwargs):       return f(*args,**kwargs) + 1    return wrapper

现在尝试在cdef函数上使用它

cdef int g(double x, double y):    # some implementation...

第一个问题是g被转换为C代码,就像

int g(double x, doubley)
可以通过函数指针表示的那样,但是却不能像
plus_one
预期的那样被任意Python调用。其次,
wrapper
没有办法(从C函数指针知道)什么
g
叫s参数(不能做
**kwargs
),也没有任何简单的方法来进行
*args
扩展。

您可以通过采用特定的函数指针类型并返回可调用的Python来制作类似装饰器的内容:

cdef plus_one(int (*f)(double, double):    def wrapper(double x, double y):       return f(x, y) + 1    return wrappercdef int _g(double x, double y):    # some implementationg = plus_one(_g) # kind of like a decorator

但是, 您已经失去了使用

cdef
函数的全部好处,因为
g
现在它是一个可调用的通用Python,带有所有随之而来的开销。


附录:一种替代的表达方式是装饰器是运行时的Python功能(通常在模块导入时运行)。

cdef
函数是编译时的C功能。尽管可能并非不可能实现“编译时装饰器”之类的东西,但对Cython来说将是一个相当重大的改变。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5673468.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存