Cython – 定义2d数组

这是我想要优化的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 -a显示

我想当我尝试初始化零阵列贷款和aggloan时,numpy会减慢我的速度.但我需要运行5000笔贷款.只是想知道当我定义3d / 2d并返回数组时是否还有其他方法可以避免使用numpy …

最佳答案
黄色部分是因为Numpy调用,您在其中分配数组.你可以做的是将这些数组作为参数传递给函数,并从一个到另一个重用它们.

此外,我看到你正在重写所有元素,所以你要求记忆,用零写,然后输入你的数字.如果您确定要覆盖所有元素,则可以使用np.empty,它不会初始化变量.

Note: Linux kernel has a specific way of allocating memory initialised to 0, that is faster that any other value, and modern Numpy can use it, but it is still slower than empty:

In [4]: %timeit np.zeros((100,100))
100000 loops, best of 3: 4.04 µs per loop

In [5]: %timeit np.ones((100,100))
100000 loops, best of 3: 8.99 µs per loop

In [6]: %timeit np.empty((100,100))
1000000 loops, best of 3: 917 ns per loop

最后但并非最不重要的,你确定这是你的瓶颈吗?我不知道你在做什么处理,但黄色是C代码的行数,而不是时间.无论如何,从时间上看,使用空的应该加速四倍.如果您想要更多,请将其余代码发布在CR.

编辑:

扩展我的第二句:你的功能签名可以

def genLoans(int loanid, cdef double[:,:,:] loans,  cdef double[:,:] aggloan):

您在循环之前初始化数组,并一次又一次地传递它们.

在任何情况下,在我的机器(Linux Intel i5)中,它需要9μs,因此您总共花费45 ms.这绝对不是你的瓶颈.轮廓!

转载注明原文:Cython – 定义2d数组 - 代码日志