2017-02-02 39 views
3

最近我遇到了一个人使用numpy.transpose而不是numpy.ndarray.T。我很好奇,所以我计时它:为什么numpy.ndarray.T比numpy.transpose(numpy.ndarray)快得多?

from timeit import timeit 
import numpy as np 

array1015 = np.random.rand(10,15) 

def nptrans(): 
    np.transpose(array1015) 

def npt(): 
    array1015.T 

print(timeit(nptrans)) 
print(timeit(npt)) 

结果为:

np.transpose: 1.25864219666 

np.ndarray.T: 0.720939874649 

为什么?他们不应该在引擎盖下做同样的事吗?也许np.transpose正在做某种错误检查或者减慢它的速度?

回答

3

首先,操作速度如此之快,如果在那里进行优化并不重要!

%timeit nptrans() # 100000 loops, best of 3: 2.11 µs per loop 
%timeit npt()  # 1000000 loops, best of 3: 905 ns per loop 

对此进行优化是没有意义的,除非您要进行数百万次转置而没有其他操作。即使加入他们是非常非常慢:

%timeit array1015 + array1015 # 100000 loops, best of 3: 3.55 µs per loop 

和另外应该是真的,真的快速

然而存在一些np.transpose开销不存在于np.ndarray.T

  • np.transpose到底调用对象.transpose -method这意味着它必须查找对象和呼叫的方法它。
  • 为了避免重复他们的代码,开发人员在单独的函数中打包了实际调用方法的函数。 =>多一个函数调用。

因此,您看到的开销是2个函数调用和一个getattr-调用的结果。该np.transpose function实际上是蟒蛇,所以你可以很容易地看到开销(我删除评论):

def transpose(a, axes=None): 
    return _wrapfunc(a, 'transpose', axes) # extra function call 

def _wrapfunc(obj, method, *args, **kwds): 
    try: 
     return getattr(obj, method)(*args, **kwds) # here it finally calls ndarray.transpose() 
    except (AttributeError, TypeError): 
     return _wrapit(obj, method, *args, **kwds) 
+0

我明白了。那么有问题的代码是一个Udacity项目的神经网络,所以它可能会有所作为,我必须检查。 – wordsforthewise

相关问题