cython 函数中的 Lambda 表达式
Posted
技术标签:
【中文标题】cython 函数中的 Lambda 表达式【英文标题】:Lambda expression in cython function 【发布时间】:2018-10-07 03:26:40 【问题描述】:我想将 lambda 表达式与 cython 一起使用,但它不适用于 cpdef。错误表示尚不支持,但cython changeleg 表示支持 lambda 表达式。
%%cython
cimport numpy as np
import numpy as np
cdef foo():
a = np.random.randint(1,10,10)
b = sorted(a, key = lambda x: x%np.pi) #Compiles
return(b)
cpdef goo():
a = np.random.randint(1,10,10)
b = sorted(a) #Compiles
return(b)
cpdef hoo():
a = np.random.randint(1,10,10)
b = sorted(a, key = lambda x: x%np.pi) #Compile time error
return(b)
Error compiling Cython file:
------------------------------------------------------------
...
cpdef goo():
a = np.random.randint(1,10,10)
b = sorted(a)
return(b)
cpdef hoo():
^
------------------------------------------------------------
/********/.cache/ipython/cython/_cython_magic_63378538fa4250ed3135e0289d6af7a0.pyx:14:6: closures inside cpdef functions not yet supported
确实是不支持 lambda 表达式还是我遗漏了什么?
Python 版本 3.5.5; Cython 版本:0.24
【问题讨论】:
我只能看到“Python 函数完全支持闭包”和“类主体和模块级别支持 Lambda 表达式”与cpdef
s 无关。
但是,知道cpdef
有什么问题会很有趣,因为def
和cdef
似乎对 lambdas 没有问题
我假设当他们说它在模块级别受支持时,它暗示它在功能中受支持。但是,是的,情况可能并非如此。
@ead 我会解释为“Cython 支持内部函数和 lambda 表达式”。就像 OP 所做的那样,但是如果您考虑前一句(同一点),那就很模糊了。
这看起来应该是a bug report 不仅仅是一个问题。
【参考方案1】:
这只是关于 cpdef 方法中的闭包。如果您没有在 cpdef 函数中定义任何函数,即闭包,这将起作用。 Lambda 表达式只是一个函数,但具有特定的语法。试试这个。
def sort_key(x):
return x%np.pi
cpdef hoo():
a = np.random.randint(1,10,10)
b = sorted(a, key = sort_key)
return(b)
【讨论】:
感谢您的回答,但这不是我想要的。以上是关于cython 函数中的 Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章
python中的zipmapreduce lambda函数的使用。