首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cython和numpy

Cython和numpy
EN

Stack Overflow用户
提问于 2016-08-19 03:12:11
回答 2查看 1.6K关注 0票数 0

尝试运行高性能Python的示例7-11

cython_np.pyx

代码语言:javascript
复制
#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

代码语言:javascript
复制
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

代码语言:javascript
复制
python3 setup.py build_ext --inplace

得到一些警告

代码语言:javascript
复制
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

当我试图在Ipython中运行使用函数calculate.calculate.z时,它说

代码语言:javascript
复制
TypeError: a bytes-like object is required, not 'list'

使用Compuate.z的细节

对警告有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-19 04:08:21

我认为,基于http://docs.cython.org/en/latest/src/userguide/memoryviews.html中的例子

代码语言:javascript
复制
double complex[:] zs

使用double complex dtype定义一个一维内存视图。这类似于带有该dtype的numpy数组。

您的代码将列表传递给此函数。列表是Python对象,不能作为C或Cython原生数组访问。

您的源提供了如何调用此函数的任何信息吗?我拿不到那本书。

票数 0
EN

Stack Overflow用户

发布于 2021-11-05 02:26:54

同样的问题发生在第二版。虽然np.asarray()可以解决这个问题,但它可能(根据我自己的实验)会在一定程度上损害代码性能。原因可能是我们需要为新创建的数组分配新的空间)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39030546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档