2017-02-02 71 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

相關問題