作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解如何最好地利用 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
有人可以解释为什么会这样吗?
编辑:评论中建议我使用较小的矩阵 (1000,1000) 再试一次。当我运行时:
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 版本)上的第二个结果 - 它与您的第一个结果相似:
In [27]: X = np.ones((10000,10000),dtype='float64')
...: 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.6 ms per loop
10 loops, best of 3: 62 ms per loop
编辑:我直接使用 timeit.repeat()
重复了你所有的计算:
import timeit
t = timeit.repeat('np.sum(X,axis=0)', setup="import numpy as np; X = np.ones((10000,10000),dtype='float64')", repeat=50, number=1); print(min(t));
t = timeit.repeat('np.sum(X,axis=1)', setup="import numpy as np; X = np.ones((10000,10000),dtype='float64')", repeat=50, number=1); print(min(t));
t = timeit.repeat('np.sum(X,axis=0)', setup="import numpy as np; X = np.ones((10000,10000),dtype='int64')", repeat=50, number=1); print(min(t));
t = timeit.repeat('np.sum(X,axis=1)', setup="import numpy as np; X = np.ones((10000,10000),dtype='int64')", repeat=50, number=1); print(min(t));
使用这些时间:
Python 2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08)
IPython 5.3.0 -- An enhanced Interactive Python.
numpy 1.12.1
0.0637669563293 # float64, axis=0
0.0558688640594 # float64, axis=1
0.0669782161713 # int64, axis=0
0.0576930046082 # int64, axis=1
和
Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:14:59)
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
numpy 1.13.1
0.06289491400821134
0.05558946297969669
0.0670205659698695
0.057950171001721174
和
Python 3.5.3 |Continuum Analytics, Inc.| (default, Mar 6 2017, 12:15:08)
IPython 5.3.0 -- An enhanced Interactive Python.
numpy 1.11.3
0.06345970398979262
0.05561513203429058
0.07043616304872558
0.057934076990932226
最后,在我的 Android 手机上:
Python 3.6.2 (default, Jul 19 2017, 11:01:41)
IPython 6.1.0
numpy 1.12.0
0.39130385394673795
0.24979593697935343
0.42852322908584028
0.28863119706511497
和Windows系统(python 3.4 32bit):
0.158213707338
0.149441164907
0.365552662475
0.128456460354
关于python - dtype如何影响Numpy中的行列运算速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45705350/
我是一名优秀的程序员,十分优秀!