gpt4 book ai didi

arrays - Cython - 定义二维数组

转载 作者:行者123 更新时间:2023-12-02 04:01:47 24 4
gpt4 key购买 nike

这是我正在尝试优化的 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 显示

enter image description here我想当我尝试初始化零数组贷款和 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代码的行数,而不是时间。无论如何,从时间上来看,使用 empty 应该可以将速度提高四倍。如果您需要更多信息,请将其余代码发布到 CR。

编辑:

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

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

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

无论如何,在我的机器(Linux Intel i5)中,它需要 9μs,所以总共花费了 45 ms。这绝对不是你的瓶颈。简介!

关于arrays - Cython - 定义二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com