python 中转置函数的差异
Differences of transpose functions in python
我正在生成一个带有随机数的大矩阵(100x100,我们称之为 X),numpy.matrix() 这样我就有了一个 numpy.ndarray.
我一直在想这两个操作有没有区别:
- numpy.transpose(X)
- X.T
我测量了循环中每个操作的时间,范围为 1000,似乎 X.T 明显快于 numpy.transpose(X)
添加的基准:
对于 100x100 矩阵,我得到以下结果 X.T 和 numpy.tranpose(X)
在 10.000 范围循环中:
- 7421/10.000:X.T最快
- 1256/10.000:numpy.transpose(X)最快
- 1323/10.000: 相同的计算时间或差异太小无法确定
添加了下面的代码
import numpy as np
import time
np_transpose_count = 0
T_transpose_count = 0
equal_count = 0
for i in range(10000):
Se = np.random.rand(100,100)
tic1 =time.clock()
ST_T = Se.T
toc1=time.clock()
tic2 =time.clock()
ST_np = np.transpose(Se)
toc2=time.clock()
if (toc1-tic1) < (toc2-tic2):
T_transpose_count+=1
elif (toc1-tic1) > (toc2-tic2):
np_transpose_count+=1
else:
equal_count+=1
print(T_transpose_count, np_transpose_count, equal_count)
此致
呼呼
使用 Ipython %timeit
魔法我得到:
In [218]: X=np.ones((100,100))
In [219]: timeit X.T
1000000 loops, best of 3: 379 ns per loop
In [220]: timeit X.transpose()
1000000 loops, best of 3: 470 ns per loop
In [221]: timeit np.transpose(X)
1000000 loops, best of 3: 993 ns per loop
In [222]: timeit X+1
10000 loops, best of 3: 21.6 µs per loop
所以是的,.T
最快,函数最慢。但是将这些时间与简单加法的时间进行比较
或副本或切片
In [223]: timeit X.copy()
100000 loops, best of 3: 10.8 µs per loop
In [224]: timeit X[:]
1000000 loops, best of 3: 465 ns per loop
转置所有形式 returns 一个新的数组对象,具有新的 shape
和 strides
,但具有共享数据缓冲区(查看 .__array_interface__
字典看到那个)。因此,它与 return 和 view
的其他操作花费的时间大致相同。但是 none 的转置函数会复制数据或遍历数据。所以时差只是头顶调用的结果。
再次使用 ipython
魔法
np.transpose??
def transpose(a, axes=None):
try:
transpose = a.transpose
except AttributeError:
return _wrapit(a, 'transpose', axes)
return transpose(axes)
所以 np.function(X)
最终调用 X.transpose()
.
我不得不查看 numpy 代码,但我记得 .T
是作为 attribute
实现的(与 property
不太一样)。我怀疑它更快,因为它不使用 axes
参数,因此节省了一两次 C
函数调用。
我正在生成一个带有随机数的大矩阵(100x100,我们称之为 X),numpy.matrix() 这样我就有了一个 numpy.ndarray.
我一直在想这两个操作有没有区别:
- numpy.transpose(X)
- X.T
我测量了循环中每个操作的时间,范围为 1000,似乎 X.T 明显快于 numpy.transpose(X)
添加的基准:
对于 100x100 矩阵,我得到以下结果 X.T 和 numpy.tranpose(X)
在 10.000 范围循环中:
- 7421/10.000:X.T最快
- 1256/10.000:numpy.transpose(X)最快
- 1323/10.000: 相同的计算时间或差异太小无法确定
添加了下面的代码
import numpy as np
import time
np_transpose_count = 0
T_transpose_count = 0
equal_count = 0
for i in range(10000):
Se = np.random.rand(100,100)
tic1 =time.clock()
ST_T = Se.T
toc1=time.clock()
tic2 =time.clock()
ST_np = np.transpose(Se)
toc2=time.clock()
if (toc1-tic1) < (toc2-tic2):
T_transpose_count+=1
elif (toc1-tic1) > (toc2-tic2):
np_transpose_count+=1
else:
equal_count+=1
print(T_transpose_count, np_transpose_count, equal_count)
此致 呼呼
使用 Ipython %timeit
魔法我得到:
In [218]: X=np.ones((100,100))
In [219]: timeit X.T
1000000 loops, best of 3: 379 ns per loop
In [220]: timeit X.transpose()
1000000 loops, best of 3: 470 ns per loop
In [221]: timeit np.transpose(X)
1000000 loops, best of 3: 993 ns per loop
In [222]: timeit X+1
10000 loops, best of 3: 21.6 µs per loop
所以是的,.T
最快,函数最慢。但是将这些时间与简单加法的时间进行比较
或副本或切片
In [223]: timeit X.copy()
100000 loops, best of 3: 10.8 µs per loop
In [224]: timeit X[:]
1000000 loops, best of 3: 465 ns per loop
转置所有形式 returns 一个新的数组对象,具有新的 shape
和 strides
,但具有共享数据缓冲区(查看 .__array_interface__
字典看到那个)。因此,它与 return 和 view
的其他操作花费的时间大致相同。但是 none 的转置函数会复制数据或遍历数据。所以时差只是头顶调用的结果。
再次使用 ipython
魔法
np.transpose??
def transpose(a, axes=None):
try:
transpose = a.transpose
except AttributeError:
return _wrapit(a, 'transpose', axes)
return transpose(axes)
所以 np.function(X)
最终调用 X.transpose()
.
我不得不查看 numpy 代码,但我记得 .T
是作为 attribute
实现的(与 property
不太一样)。我怀疑它更快,因为它不使用 axes
参数,因此节省了一两次 C
函数调用。