簡體   English   中英

Cython 和 numpy

[英]Cython and numpy

嘗試運行高性能 Python示例 7-11

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

設置文件

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

得到一些警告

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 中運行 use function calculate.calculate.z時,它說

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 的一維內存視圖。 這類似於具有該 dtype 的numpy數組。

您的代碼將列表傳遞給此函數。 列表是 Python 對象,不能作為 C 或 Cython 原生數組訪問。

您的消息來源是否提供有關如何調用此函數的任何信息? 我無權訪問那本書。

同樣的問題發生在第 2 版中。 雖然np.asarray()可以解決問題,但它可能會(基於我自己的實驗)在某種程度上損害代碼性能。 原因可能是我們需要為新創建的數組分配新空間)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM