Можно ли избежать Python с помощью двумерного массива NumPy в Cython? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь минимизировать зависимость Python в цикле while для больших рядов данных (> 200MM значений).

Сравнение или установка массива 1D NumPy в Cython можно полностью выполнить с C, но то же самое с 2D-массивом NumPy превращается в дорогой Python.

Кто-нибудь знает, как этого избежать?

Пример минимального кода:

#!python
#cython: boundscheck=False
#cython: wraparound=False
#cython: cdivision=True

import numpy as np
cimport numpy as np

def sometest():
    cdef np.ndarray[np.float64_t, ndim=1] arr1d = np.zeros((10))
    cdef np.ndarray[np.float64_t, ndim=2] arr2d = np.zeros((10))

    if arr1d[0] > 1:
        arr1d[0] = 1

    if arr2d[0][0] > 1:
        arr2d[0][0] = 1

Аннотация Cython:

Cython annotation

Расширенная аннотация Cython:

Expanded Cython annotation

Заранее спасибо за любые идеи.

1 Ответ

0 голосов
/ 24 июня 2019

Спасибо @ hpaulj.

Доступ с помощью arr2d [0,0] вместо arr2d [0] [0] действительно не ухудшается до Python.

Обновленный код:

#!python
#cython: boundscheck=False
#cython: wraparound=False
#cython: cdivision=True

import numpy as np
cimport numpy as np

def sometest():
    cdef np.ndarray[np.float64_t, ndim=1] arr1d = np.zeros((10))
    cdef np.ndarray[np.float64_t, ndim=2] arr2d = np.zeros((10, 10))

    if arr1d[0] > 1:
        arr1d[0] = 1

    if arr2d[0][0] > 1:
        arr2d[0][0] = 1

    if arr2d[0,0] > 1:
        arr2d[0,0] = 1

Аннотация Cython:

Cython annotation

...