我的Cython代码与Python的交互太多
我在Cython中实现了一个循环以加快代码的速度: 当我跑步时:我的Cython代码与Python的交互太多,python,c,arrays,cython,Python,C,Arrays,Cython,我在Cython中实现了一个循环以加快代码的速度: 当我跑步时: $ cython loop_fun2.pyx -a 我得到以下输出: 似乎我的Cython代码几乎在每一行都与Python解释器交互。我希望删除这种交互,以加快我的代码。 我需要在我的代码中更改什么,以便它只使用C解释器运行?我怀疑这个问题与我定义数组的方式有关 编辑: 以下是有关该问题的一些补充信息: 代码如下: import cython from cython.view cimport array as cvarray
$ cython loop_fun2.pyx -a
我得到以下输出:
似乎我的Cython代码几乎在每一行都与Python解释器交互。我希望删除这种交互,以加快我的代码。
我需要在我的代码中更改什么,以便它只使用C解释器运行?我怀疑这个问题与我定义数组的方式有关
编辑:
以下是有关该问题的一些补充信息:
代码如下:
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
您可以单击“+”以更详细地了解Python交互的原因。一件显而易见的事情:i1、i2、i、j是Python整数,而不是
cdef int
变量。请阅读下面的内容。问题的一个特殊流程是使用图片链接,而不是其中包含的文本。请回答您的问题,然后插入实际文本。为了澄清@UlrichEckhardt所说的内容,在本例中,图片很有用,因为它显示了一些自动高亮显示的“低效”代码位。但是,您还应该包括实际的文本。您应该首先定义cdef i1、i2、i、j
,然后才在循环中使用它们,否则这些变量就是Python对象。如果您执行上述操作,什么会保持黄色?