我试图理解为什么填充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
一组快速的测量结果(我最初在评论中发布)表明,
np.full
、np.ones
和np.arange
的行为非常相似(64位的时间是32位的两倍),三者的时间相似(arange
比我的其他2个慢10%)。在我相信这表明这是一种预期的行为,只是需要时间来填满记忆。(64位的内存显然是32位的两倍)。在
有趣的问题是,为什么
np.zeros
如此统一(而且速度很快)this C-based question可能给出了一个完整的答案,但基本的总结是,分配零(如C函数calloc
)可以懒洋洋地完成,也就是说,它实际上不会分配或填充太多,直到您真正尝试写入内存。在相关问题 更多 >
编程相关推荐