Python Cython将双复数返回到浮点复数会导致表达式不是纯C
我在Cython中尝试使用complex64\t时遇到问题。下面是我的简单cython示例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
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
扩展。谢谢大家的帮助。