объединенный тип: необъявленное имя не встроенное: двойной - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать Fused Types в своих кодах Cython, но тип double не может быть скомпилирован. Если я удалю двойной тип из объединенного типа, компиляция завершится успешно. Зачем? большое спасибо.

python 3.6.4

cython 0.27.3

import numpy as np
cimport numpy as np
cimport cython
import warnings
warnings.simplefilter("ignore")

ctypedef np.float64_t DTYPE1_t
ctypedef np.int64_t DTYPE2_t

ctypedef fused number_or_arr:
    int
    np.ndarray
    double

def SUM(np.ndarray[DTYPE1_t, ndim=1] npdata,number_or_arr n):
    if n is double:
        print('it is double')
    elif n is int:
        print('it is int')
    elif n is np.ndarray:
        print('it is arr')
    return np.sum(npdata)


[z@localhost strafunc]$ python setuptest.py build_ext --inplace
running build_ext
cythoning ctest.pyx to ctest.c

Error compiling Cython file:
------------------------------------------------------------
...
    int
    np.ndarray
    double

def SUM(np.ndarray[DTYPE1_t, ndim=1] npdata,number_or_arr n):
    if n is double:
           ^
------------------------------------------------------------

ctest.pyx:16:12: undeclared name not builtin: double
building 'ctest' extension
gcc -pthread -B /home/z/anaconda3/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/z/anaconda3/lib/python3.6/site-packages/numpy/core/include -I/home/z/anaconda3/include/python3.6m -c ctest.c -o build/temp.linux-x86_64-3.6/ctest.o
ctest.c:1:2: error: #error Do not use this file, it is the result of a failed Cython compilation.
 #error Do not use this file, it is the result of a failed Cython compilation.
  ^
error: command 'gcc' failed with exit status 1

1 Ответ

0 голосов
/ 08 мая 2020

В документации объединенных типов эти проверки представлены как:

if name_of_fused_type is double

not

if name_of_variable is double:

В вашем случае это будет:

if number_or_arr is double:

(а затем аналогичные изменения для двух других проверок). Проблема с вашей текущей версией заключается в том, что она неоднозначна - для случая int он может запрашивать проверку, является ли он int, или он может запрашивать проверку, что n является объектом типа Python, точно равным к типу Python int.


В стороне, я думаю, что будет сложно ускорить «может быть числом, может быть массивом», как это - вы бы вероятно, лучше всего оставить их нетипизированными. Cython и массивы лучше всего подходят для ускорения индексации, чего здесь нет (потому что это может быть число)

...