Python Cython将双复数返回到浮点复数会导致表达式不是纯C

Python Cython将双复数返回到浮点复数会导致表达式不是纯C,python,numpy,cython,cythonize,Python,Numpy,Cython,Cythonize,我在Cython中尝试使用complex64\t时遇到问题。下面是我的简单cython示例 cimport numpy as cnp cdef extern from "complex.h": double complex cexp(double complex) cpdef example(): cdef float b = 2.0 cdef cnp.complex64_t temp1 cdef cnp.complex128_t temp2 tem

我在Cython中尝试使用complex64\t时遇到问题。下面是我的简单cython示例

cimport numpy as cnp

cdef extern from "complex.h":
    double complex cexp(double complex)

cpdef example():
    cdef float b = 2.0
    cdef cnp.complex64_t temp1
    cdef cnp.complex128_t temp2

    temp1 = cexp(1j * b)
    temp2 = cexp(1j * b)
当我使用以下setup.py对文件进行cythonize时

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


ext_modules = [
    Extension(
        "bug_example",
        ["bug_example.pyx"],
        include_dirs=[np.get_include()],
    )
]


setup(
    name='bug_example',
    ext_modules=cythonize(ext_modules, annotate=True,
                          compiler_directives={'boundscheck': False})
)
一切编译都没有问题,但我在包含

temp1 = cexp(1j * b)
但不是在

temp2 = cexp(1j * b)
这似乎是一个将双复数返回到浮点复数的问题。我曾尝试将其显式转换为浮动复合体,如:

temp1 = <float complex>(cexp(1j * b))
temp1=(cexp(1j*b))
但这没什么区别


有人能帮我修复我的代码,使temp1的行不再有黄色,并且是纯C。这将允许我在cython中使用openmp

黄色是由于
\uuuupyx\ucreal
\uuupyx\ucimag
造成的,这不应该是一个问题,但谁知道呢

为了避免这种情况,您必须避免从
double
float
再向后施放

例如:

cimport numpy as cnp

#take the float version (cexpf) instead of double-version (cexp)
cdef extern from "complex.h":
     float complex cexpf(float complex)

#1j maps to double complex, so create a float version
cdef float complex float_1j = 1j

cpdef example():
    cdef float b_float = 2.0                              #use float not double
    cdef cnp.complex64_t temp1 = cexpf(float_1j*b_float)  #everything is float

它实际上是否使用了任何Python API调用(或以任何其他方式阻止openmp)?正如它所说,注释颜色是一种暗示;如果您单击
+
符号并查看C代码,它在做什么?我认为如果它不使用Python(加上宏调用以获取CYTHON complex128的实部和imag部分),它应该调用一些宏或内联函数,这些函数定义在C文件的更高一级,只执行类似于
(x)+(y)*(这里是
),您应该能够非常容易地验证它…尽管它可能会很混乱,因为IIRC、Cython为C++98、C11、C99和C89编写这些宏的替代版本,并通过检查预处理器标志在它们之间切换。此外,您没有指定语言。如果您为C89构建,它将使用complex64和complex128的结构,这几乎没有Python或任何东西慢,但仍然不如内置的C复杂类型好(对于涉及无穷大的情况可能不正确,IIRC)。您使用哪种编译器?如果是gcc,那么我怀疑这行代码是否会阻止openmp的使用,因为宏
\uuuuuPyx\uCreal
扩展为
\uuuuuuuReal\uuuuuuuu
扩展。谢谢大家的帮助。