cython编译问题 - 不需要也不会发出

时间:2018-02-03 21:21:57

标签: python ipython cython

我试图使用Cython加速快速排序算法,但它没有编译....有什么理由吗?可能会遗漏什么?

我使用的是Python 3.6.3和Cython版本0.26.1,它附带适用于Mac OS的Anaconda发行版。

In [87]: %%cython
    ...: cdef double[:] qsort2(double[:] a, long lo, long hi):
    ...:     cdef: 
    ...:         long i, j
    ...:         double pivot
    ...:     i = lo
    ...:     j = hi
    ...:     while i < hi:
    ...:         pivot = a[(lo+hi) // 2]
    ...:         while i <= j:
    ...:             while a[i] < pivot:
    ...:                 i += 1
    ...:             while a[j] > pivot:
    ...:                 j -= 1
    ...:             if i <= j:
    ...:                 a[i], a[j] = a[j], a[i]
    ...:                 i += 1
    ...:                 j -= 1
    ...:         if lo < j:
    ...:             qsort2(a, lo, j)
    ...:         lo = i
    ...:         j = hi
    ...:     return a
    ...: 
/Users/tomkwong/.ipython/cython/_cython_magic_06daa4a516cc6df6f7b933d4e9ea2c22.c:1759:27: warning: function '__pyx_f_46_cython_magic_06daa4a516cc6df6f7b933d4e9ea2c22_qsort2' is not needed and will not be emitted [-Wunneeded-internal-declaration]
static __Pyx_memviewslice __pyx_f_46_cython_magic_06daa4a516cc6df6f7b933d4e9ea2c22_qsort2(__Pyx_memviewslice __pyx_v_a, long __pyx_v_lo, long __pyx_v_hi) {
                          ^
1 warning generated.

In [88]: qsort2(lst, 0, len(lst)-1)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-88-d49a83090415> in <module>()
----> 1 qsort2(lst, 0, len(lst)-1)

NameError: name 'qsort2' is not defined

1 个答案:

答案 0 :(得分:0)

事实证明,Cython希望使用它的功能。因此,应该定义python包装函数。在同一个ipython单元格中执行此操作就可以了。 e.g。

In [100]: %%cython
     ...: cdef double[:] qsort2(double[:] a, long lo, long hi):
     ...:     cdef: 
     ...:         long i, j
     ...:         double pivot
     ...:     i = lo
     ...:     j = hi
     ...:     while i < hi:
     ...:         pivot = a[(lo+hi) // 2]
     ...:         while i <= j:
     ...:             while a[i] < pivot:
     ...:                 i += 1
     ...:             while a[j] > pivot:
     ...:                 j -= 1
     ...:             if i <= j:
     ...:                 a[i], a[j] = a[j], a[i]
     ...:                 i += 1
     ...:                 j -= 1
     ...:         if lo < j:
     ...:             qsort2(a, lo, j)
     ...:         lo = i
     ...:         j = hi
     ...:     return a
     ...: 
     ...: def qsort2_py(a, b, c):
     ...:     return qsort2(a, b, c)
     ...: 
     ...: