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 函数的指针确实是您所需要的。
我正在使用最新的带有 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 函数的指针确实是您所需要的。