Ошибка при преобразовании массива из списка, отправленного в функцию Cython - PullRequest
0 голосов
/ 08 марта 2020

В python:

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

В Cython:

cimport cython
cpdef int[:] quicksort(int[:] arr):
    cdef int pivot
    cdef int[:] left
    cdef int[:] middle
    cdef int[:] right
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(*left) + middle + quicksort(*right)

Файл установки:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy

extensions = [
    Extension("numpy_cy", ["numpy_cy.pyx"],
              include_dirs = [numpy.get_include()],
              )
]

setup(
    name = "numpy_cy",
    ext_modules = cythonize(extensions)
    )

И в файле main.py:

arr = list(np.random.randint(1000) for _ in range(100000))
arr = np.array(arr, dtype=np.int32)

numpy_cy.quicksort(arr)

Моя ошибка в консоли:

$ python3 lab01.py
> - Traceback (most recent call
> - File "lab01.py", line 40, in <module>
>   - numpy_cy.quicksort(arr)
> - File "numpy_cy.pyx", line 8, in numpy_cy.quicksort
> - File "numpy_cy.pyx", line 16, in numpy_cy.quicksort
> - File "stringsource", line 658, in View.MemoryView.memoryview_cwrapper
> - File "stringsource", line 349, in View.MemoryView.memoryview.__cinit__
> - TypeError: a bytes-like object is required, not 'list'

Кто-нибудь может мне помочь или дать мне совет?

...