尝试运行例7-11 高性能Python
cython_np.pyx
#cython_np.pyx
import numpy as np
cimport numpy as np
def calculate_z(int maxiter, double complex[:] zs, double complex[:] cs):
cdef unsigned int i, n
cdef double complex z, c
cdef int[:] output = np.empty(len(zs), dtype = np.int32)
for i in range(len(zs)):
n = 0
z = zs[i]
c = cs[i]
while n < maxiter and (z.real * z.real + z.imag * z.imag) < 4:
z = z * z + c
n += 1
output[i] = n
return output
setup . py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass = {'build_ext':build_ext},
ext_modules = [Extension("calculate", ["cythonfn.pyx"])]
)
在终端中,ubuntu 16.04
python3 setup.py build_ext --inplace
get some warning
running build_ext
cythoning cythonfn.pyx to cythonfn.c
building 'calculate' extension
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c cythonfn.c -o build/temp.linux-x86_64-3.5/cythonfn.o
In file included from /usr/include/python3.5m/numpy/ndarraytypes.h:1777:0,
from /usr/include/python3.5m/numpy/ndarrayobject.h:18,
from /usr/include/python3.5m/numpy/arrayobject.h:4,
from cythonfn.c:274:
/usr/include/python3.5m/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by "
^
In file included from /usr/include/python3.5m/numpy/ndarrayobject.h:27:0,
from /usr/include/python3.5m/numpy/arrayobject.h:4,
from cythonfn.c:274:
/usr/include/python3.5m/numpy/__multiarray_api.h:1448:1: warning: ‘_import_array’ defined but not used [-Wunused-function]
_import_array(void)
^
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.5/cythonfn.o -o MY_DIR/calculate.cpython-35m-x86_64-linux-gnu.so
当我试图运行使用函数计算。z在Ipython中,它表示
TypeError: a bytes-like object is required, not 'list'
使用calculate.z的细节
你知道这个警告吗?
我认为,基于http://docs.cython.org/en/latest/src/userguide/memoryviews.html
中的例子double complex[:] zs
定义了一个具有double complex
dtype的1d内存视图。这类似于具有该dtype的numpy
数组。
你的代码将一个列表传递给这个函数。列表是Python对象,不能作为C或Cython原生数组访问。
你的源代码给出了如何调用这个函数的任何信息吗?我没有那本书的权限
同样的问题出现在第二版中。虽然np.asarray()可以解决这个问题,但它可能会在一定程度上(根据我自己的实验)损害代码性能。原因可能是我们需要为新创建的数组分配新的空间。