Cython:如何使用闭包对向量进行排序

Cython: How to sort vector with closure

我正在使用最新的带有 C++17 标志的 Cython(高于 C++11 具有闭包语法)到 GCC。 Cython 中的这种 C++ 排序似乎不允许关闭:

# File: myfunc.pyx
from libcpp.vector cimport vector
from libcpp.algorithm cimport sort

# cpdef to call from Python, it just wraps cdef anyway
cpdef myfunc():
    # int is just example, I need to sort struct vector
    cdef vector[int] v 
    v.push_back(2)
    v.push_back(1)

    # Compile error: Expected ')', found 'a'
    sort(v.begin(),v.end(), [](int a,int b){
        return a<b 
    })

Cython是否支持C++闭包以及如何使用?如何使用闭包进行 C++ 排序因为我正在将 Python 移植到 Cython 并且有很多 lambda 排序。

我已尝试搜索和更改代码,但只有这些方法:

  • 使用 .hpp header
  • 或使用Python
  • 的'sorted'函数

使用 .hpp header(如果不使用 C++ 功能,.h 也可以)

根据我的互联网搜索,Cython 中没有 C++ 闭包语法,而是使用带有运算符重载的结构。

# File: mycmp.hpp
struct cmp {
    bool operator()(int a,int b){ return a<b; }
};
# File: myfunc.pyx
cdef extern from "mycmp.hpp":
    cdef struct cmp:
        bool "operator()"(int a,int b)

cdef vector[int] v
v.push_back(2)
v.push_back(1)

cdef cmp compare
sort(v.begin(),v.end(), compare)
print(v)

使用Python

的'sorted'函数

因为 .sort 不在 vector 上,请改用 sorted 函数。这要简单得多,但对于其他类型的 lambda,可能不适用

v = sorted(v, key=lambda x: x) # x or some prop of x

在这种情况下,您实际上不需要“闭包”——您不会从周围范围捕获任何变量。因此,对于您的特定示例,您可以使用 cdef 函数(必须在全局范围内定义):

cdef bool compare(double a, double b):
    return a<b

sort(v.begin(),v.end(), compare)

这显然不是通用的解决方案。但是很多时候传递一个指向 C 函数的指针确实是您所需要的。