Arrays Cython-定义二维数组

Arrays Cython-定义二维数组,arrays,numpy,cython,Arrays,Numpy,Cython,这是我试图优化的cython代码 import cython cimport cython from libc.stdlib cimport rand, srand, RAND_MAX import numpy as np cimport numpy as np def genLoans(int loanid): cdef int i, j, k cdef double[:,:,:] loans = np.zero

这是我试图优化的cython代码

    import cython
    cimport cython
    from libc.stdlib cimport rand, srand, RAND_MAX
    import numpy as np
    cimport numpy as np

    def genLoans(int loanid):
        cdef int i, j, k
        cdef double[:,:,:] loans = np.zeros((240, 20, 1000))
        cdef double[:,:] aggloan = np.zeros((240, 20))
        for j from 0<=j<1000:
            srand(loanid*1000+j)
            for i from 0<=i<240:
                for k from 0<=k<20:
                    loans[i,k,j] = rand()
                    ###some other logics
            aggloan[i,k] += loans[i,k,j]/1000
        return aggloan
导入cython
西姆波特赛顿酒店
来自libc.stdlib cimport rand、srand、rand_MAX
将numpy作为np导入
cimport numpy作为np
def genLoans(国际贷款):
cdef int i,j,k
CDEFDouble[:,:,:]贷款=np.0((240,20,1000))
cdef double[:,:]aggoan=np.zeros((240,20))

对于0中的j,黄色部分是因为Numpy调用,在这里分配数组。您可以做的是将这些数组作为参数传递给函数,并在函数之间重用它们

另外,我看到你重写了所有的元素,所以你要求内存,用零写,然后输入数字。如果确定要覆盖所有元素,则可以使用不会初始化变量的
np.empty

注意:Linux内核有一种将内存分配到0的特殊方法,它比任何其他值都快,现代Numpy可以使用它,但它仍然比
empty
慢:

最后但并非最不重要的一点,您确定这是您的瓶颈吗?我不知道你在做什么处理,但黄色是C代码的行数,而不是时间。无论如何,从计时的角度来看,使用
empty
应该可以将速度提高四倍。如果您想要更多,请将其余代码发布到CR

编辑:

扩展我的第二句话:你的函数签名可以

def genLoans(int loanid, cdef double[:,:,:] loans,  cdef double[:,:] aggloan):
在循环之前初始化数组,然后一次又一次地传递它们


在任何情况下,在我的机器(Linux Intel i5)中,它需要9µs,因此您总共要花费45毫秒。这绝对不是您的瓶颈。个人资料

如果在pyx中,我定义了“cdef double[:]zeros=np.zeros(360)”,会有什么不同吗。那么我把agcoan=0?每次调用该函数时,这会使我的速度变慢吗?您的评论似乎不完整,@kaiyan711I是从python中的循环调用该函数的。确实,在python中循环将消耗更多的时间,但是python在读取文本文件和从数据库中读取时更方便。另一种方法是将所有文件内容作为数组传递到cython并在那里循环。只是想知道其他人会如何处理它…@kaiyan711我已经解释了一种绕过它的方法,但我确信你是在错误的树上吠叫(它花费你整个运行时间的毫秒)。如果可以的话,在CodeReview上发布代码,我们可以看一下。把我放在这里,这样我就不会错过了。
def genLoans(int loanid, cdef double[:,:,:] loans,  cdef double[:,:] aggloan):