我试图理解如何最好地利用numpy数组的C顺序来编写高性能代码。我的期望是遍历行的操作应该比遍历列的操作快。事实上,我试过的第一个例子是这样的:
X = np.ones((10000,10000),dtype='int64')
print(X.dtype)
print(X.flags)
%timeit np.sum(X,axis=0)
%timeit np.sum(X,axis=1)
这将产生输出:
int64
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
10 loops, best of 3: 79.6 ms per loop
10 loops, best of 3: 61.1 ms per loop
这正是我所期望的,因为沿行求和应该比沿列求和快。你知道吗
这是我非常困惑的地方。如果将dtype更改为float64,则列操作的速度几乎是行操作的两倍:
X = np.ones((10000,10000),dtype='float')
print(X.dtype)
print(X.flags)
%timeit np.sum(X,axis=0)
%timeit np.sum(X,axis=1)
产生输出:
float64
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
10 loops, best of 3: 67.7 ms per loop
10 loops, best of 3: 123 ms per loop
有人能解释一下为什么会这样吗?你知道吗
编辑:评论中建议我用一个较小的矩阵(10001000)再试一次。当我跑步时:
import time
import numpy as np
X = np.ones((1000,1000),dtype='float')
print(X.dtype)
print(X.flags)
%timeit np.sum(X,axis=0)
%timeit np.sum(X,axis=1)
X = np.ones((1000,1000),dtype='int64')
print(X.dtype)
print(X.flags)
%timeit np.sum(X,axis=0)
%timeit np.sum(X,axis=1)
我得到输出:
float64
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
1000 loops, best of 3: 598 µs per loop
1000 loops, best of 3: 1.06 ms per loop
int64
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
1000 loops, best of 3: 788 µs per loop
1000 loops, best of 3: 632 µs per loop
所以这种影响是持续的。你知道吗
我无法确认您在OSX上的第二个结果(各种Python版本)-它与您的第一个结果类似:
编辑:我直接使用
timeit.repeat()
重复了您的所有计算:通过这些计时:
以及
以及
最后,在我的Android手机上:
和Windows系统(python 3.4 32位):
相关问题 更多 >
编程相关推荐