如何从<algorithm>赛通实习

How to extern from <algorithm> in Cython

本文关键字:gt algorithm lt      更新时间:2023-10-16

我正在尝试使用 Cython 中<algorithm>库中的partial_sort,但我只是找不到正确extern它的正确方法。

参考

这是我失败的尝试:

%%cython -f
cdef extern from "<algorithm>" namespace "std":
    void partial_sort[RandomAccessIterator](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
    void partial_sort[RandomAccessIterator, Compare](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp)

使用 Cython 0.19.1 时出现错误消息:

Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "<algorithm>" namespace "std":
    cdef cppclass RandomAccessIterator:
        cppclass Compare
        void partial_sort[RandomAccessIterator]
                                             ^
------------------------------------------------------------
/Users/richizy/.ipython/cython/_cython_magic_cf4fbe14563c3de19c8c3af3253a182e.pyx:5:46: Not allowed in a constant expression
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "<algorithm>" namespace "std":
    cdef cppclass RandomAccessIterator:
        cppclass Compare
        void partial_sort[RandomAccessIterator]
                                             ^
------------------------------------------------------------
/Users/richizy/.ipython/cython/_cython_magic_cf4fbe14563c3de19c8c3af3253a182e.pyx:5:46: Array dimension not integer
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "<algorithm>" namespace "std":
    cdef cppclass RandomAccessIterator:
        cppclass Compare
        void partial_sort[RandomAccessIterator]
                        ^
------------------------------------------------------------
/Users/richizy/.ipython/cython/_cython_magic_cf4fbe14563c3de19c8c3af3253a182e.pyx:5:25: Array element type 'void' is incomplete

使用 Cython 0.20.1 时出现错误消息:

CompileError: command 'gcc' failed with exit status 1
warning: .ipython/cython/_cython_magic_121a91d1fdd64d85c4b01e6540fd86d6.pyx:4:52: Function signature does not match previous declaration

编辑:截至 14 年 2 月 22 日,对于 Cython 0.20.1

https://groups.google.com/forum/#!topic/cython-users/H4UEM6IlvpM

正确,Cython 不支持默认模板专用化(对于 函数或类)。它也不支持非类型名称模板 参数(没有一些黑客攻击)。 两者都缺少以下功能 我们希望有一天能到达。

  • 罗伯特

似乎 Cython 不能很好地与模板专业化配合使用。以下代码对我有用(Cython 版本 0.20,Python 2.7.5,g++ (SUSE Linux) 4.8.1)

from libcpp.vector cimport vector
cdef extern from "<algorithm>" namespace "std":
    void partial_sort[RandomAccessIterator](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
    #    void partial_sort[RandomAccessIterator, Compare](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp)
cpdef bla():
    cdef vector[int] v
    cdef int i = 0
    cdef list res = []
    v.push_back(4)
    v.push_back(6)
    v.push_back(2)
    v.push_back(5)
    partial_sort[vector[int].iterator](v.begin(), v.end(), v.end())
    for i in v:
        res.append(i)
    return res

然后

>>> import bla
>>> bla.bla()
[2, 4, 5, 6]

但是取消注释该行会断开代码

bla.pyx:15:16: Wrong number of template arguments: expected 2, got 1

下面是一个解决方法:使用两个不同的名称声明模板函数的不同专用化:

cdef extern from "<algorithm>" namespace "std":
    void partial_sort_1 "std::partial_sort"[RandomAccessIterator](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
    void partial_sort_2 "std::partial_sort"[RandomAccessIterator, Compare](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp)

然后你使用正确的一个,如:

partial_sort_1[vector[int].iterator](v.begin(), v.end(), v.end())

注意:我从Cython用户那里得到,这是一个已知的问题,并且在Cython上拥有模板部分专用化暂时在他们的愿望清单上。