
不
,您无法轻松编写
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来说将是一个相当重大的改变。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)