Мой код Cython слишком сильно взаимодействует с Python - PullRequest
2 голосов
/ 27 февраля 2020

Я реализовал все oop в Cython, чтобы ускорить мой код:

При запуске:

$ cython loop_fun2.pyx -a

я получаю следующий вывод:

enter image description here

Кажется, что мой код Cython взаимодействует с интерпретатором Python почти в каждой строке. Я надеюсь удалить это взаимодействие, чтобы ускорить мой код. Что мне нужно изменить в моем коде, чтобы он работал только с интерпретатором C? Я подозреваю, что проблема связана со способом, которым я определил массивы ...

Отредактировано: вот некоторая дополнительная информация по проблеме: enter image description here

И вот код:

import cython
from cython.view cimport array as cvarray
from cpython.array cimport array, clone
import numpy as np

from libc.math cimport acos, pi, sqrt


@cython.cdivision
@cython.boundscheck(False)
@cython.wraparound(False)

def fill_mat(double[:,:] K,double[:,:] K_ii,double[:,:] K_jj, int q, int 
P, int Q):
    return fill_mat1(K,K_ii,K_jj, q, P, Q)
cdef fill_mat1(double[:,:] K,double[:,:] K_ii,double[:,:] K_jj, int q, int 
P, int Q):

cdef double[:,:] sigma=cvarray(shape=(P,Q), itemsize=sizeof(double), format="d")
cdef double[:,:] sigma_ii=cvarray(shape=(P,Q), itemsize=sizeof(double), format="d")
cdef double[:,:] sigma_jj=cvarray(shape=(P,Q), itemsize=sizeof(double), format="d")
cdef double temp_K
cdef double temp_K_ii
cdef double temp_K_jj

for i1 in range(P):
    for i2 in range(Q):
        temp_K = 0.0
        temp_K_ii = 0.0
        temp_K_jj = 0.0
        for i in range(0,q):
            for j in range(0,q):
                temp_K = temp_K + K[i1+i,i2+j]
                temp_K_ii = temp_K_ii + K_ii[i1+i,i2+j]
                temp_K_jj = temp_K_jj + K_jj[i1+i,i2+j]

        sigma[i1,i2] = temp_K
        sigma_ii[i1,i2] = temp_K_ii
        sigma_jj[i1,i2] = temp_K_jj

return sigma, sigma_ii, sigma_jj
...