最近,我遇到了使用numpy.transpose
代替numpy.ndarray.T
的人。我很好奇所以我计时了:
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
正在进行某种错误检查或者会减慢它的速度?
答案 0 :(得分: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
- 方法,这意味着它必须查找对象的方法并调用它。所以你看到的开销是2个函数调用和getattr
- 调用的结果。 np.transpose
function实际上是python,所以你可以很容易地看到开销(我删除了注释):
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)