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 表达式”与cpdefs 无关。 但是,知道cpdef 有什么问题会很有趣,因为defcdef 似乎对 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 表达式的主要内容,如果未能解决你的问题,请参考以下文章

C++C++中的lambda表达式和函数对象

python中的zipmapreduce lambda函数的使用。

java中的lambda表达式是啥?

python中的zipmapreduce lambda函数的使用

自己理解Java中的lambda

属性构造函数中的 Lambda 表达式