我试图使用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
答案 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)
...:
...: