在比32位数组慢的Cython中填充64位numpy数组

2024-04-19 02:53:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解为什么填充64位数组比填充32位数组慢。在

以下是示例:

@cython.boundscheck(False)
@cython.wraparound(False)
def test32(long long int size):
   cdef np.ndarray[np.int32_t,ndim=1] index = np.zeros(size, np.int32)
   cdef Py_ssize_t i

   for i in range(size):
       index[i] = i

   return indx

@cython.boundscheck(False)
@cython.wraparound(False)
def test64(long long int size):
   cdef np.ndarray[np.int64_t,ndim=1] index = np.zeros(size, np.int64)
   cdef Py_ssize_t i

   for i in range(size):
       index[i] = i

   return indx

时间安排:

^{pr2}$

我使用64位计算机和Python(9)编译器的Visual C++。在

编辑:

初始化64位数组和32位数组所花费的时间似乎相同,这意味着时间差是由于填充过程造成的。在

In [8]: %timeit np.zeros(1000000,'int32')
100000 loops, best of 3: 2.49 μs per loop

In [9]: %timeit np.zeros(1000000,'int64')
100000 loops, best of 3: 2.49 μs per loop

编辑2:

正如DavidW指出的,这种行为可以用np.arange公司,这意味着这是预期的:

In [7]: %timeit np.arange(1000000,dtype='int32')
10 loops, best of 3: 1.22 ms per loop

In [8]: %timeit np.arange(1000000,dtype='int64')
10 loops, best of 3: 2.03 ms per loop

Tags: infalsesizeindexnpzeros数组cython
1条回答
网友
1楼 · 发布于 2024-04-19 02:53:29

一组快速的测量结果(我最初在评论中发布)表明,np.fullnp.onesnp.arange的行为非常相似(64位的时间是32位的两倍),三者的时间相似(arange比我的其他2个慢10%)。在

我相信这表明这是一种预期的行为,只是需要时间来填满记忆。(64位的内存显然是32位的两倍)。在

有趣的问题是,为什么np.zeros如此统一(而且速度很快)this C-based question可能给出了一个完整的答案,但基本的总结是,分配零(如C函数calloc)可以懒洋洋地完成,也就是说,它实际上不会分配或填充太多,直到您真正尝试写入内存。在

相关问题 更多 >