我正在尝试在Cython中做一个复杂的指数运算。
我已经能够将以下代码整合在一起pyx
:
from libc.math cimport sin, cos, acos, exp, sqrt, fabs, M_PI, floor, ceil
cdef extern from "complex.h":
double complex cexp(double complex z)
import numpy as np
cimport numpy as np
import cython
from cython.parallel cimport prange, parallel
def try_cexp():
cdef:
double complex rr1
double complex rr2
rr1 = 1j
rr2 = 2j
print(rr1*rr2)
#print(cexp(rr1))
请注意,print(cexp(rr1))
已注释。当该行处于活动状态时,运行时出现以下错误setup.py
:
error: command 'C:\\WinPYthon\\Winpython-64bit-3.4.3.6\\python-3.4.3.amd64\\scripts\\gcc.exe' failed with exit status 1
请注意,当cexp
被注释掉时,一切都会正常运行...我可以运行setup.py
,并且在测试功能时,它会打印出两个复数的乘积。
这是我的setup.py
档案。请注意,它包含openmp
使用g ++在Cython中运行的代码:
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np
import os
os.environ["CC"] = "g++-4.7"
os.environ["CXX"] = "g++-4.7"
# These were added based on some examples I had seen of cexp in Cython. No effect.
#import pyximport
#pyximport.install(reload_support=True)
ext_modules = [
Extension('complex_test',
['complex_test.pyx'],
language="c++",
extra_compile_args=['-fopenmp'],
extra_link_args=['-fopenmp', '-lm']) # Note that '-lm' was
# added due to an example where someone mentioned g++ required
# this. Same results with and without it.
]
setup(
name='complex_test',
cmdclass={'build_ext': build_ext},
ext_modules=ext_modules,
include_dirs=[np.get_include()]
)
最终,我的目标是加快看起来k*exp(z)
,复杂k
且z
复杂的计算。目前,我正在使用数值表达式,但是它具有很大的内存开销,并且我相信有可能进行更多的优化。
感谢您的帮助。
您正在使用cexp
的,而不是exp
因为它是在C++
。更改cdef extern
为:
cdef extern from "<complex.h>" namespace "std":
double complex exp(double complex z)
float complex exp(float complex z) # overload
以及您的打印呼叫至:
print(exp(rr1))
它应该是一种魅力。
我知道编译消息很长,但是在那儿您可以找到指向罪魁祸首的错误:
complex_test.cpp: In function ‘PyObject* __pyx_pf_12complex_test_try_cexp(PyObject*)’:
complex_test.cpp:1270:31: error: cannot convert ‘__pyx_t_double_complex {aka std::complex<double>}’ to ‘__complex__ double’ for argument ‘1’ to ‘__complex__ double cexp(__complex__ double)’
__pyx_t_3 = cexp(__pyx_v_rr1);
这很麻烦,但是您可以看到原因。*您正在为需要不同类型()的函数提供C++
定义的类型(__pyx_t_double_complex
在Cython行话中)。C
__complex__ double
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句