最近我发现有人使用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是在做某种错误检查,还是在做一些减慢错误检查速度的事情?

最佳答案

首先,操作太快了,在那里进行优化并不重要!

%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最后调用objects.transpose-方法,这意味着它必须查找对象的方法并调用它。
为了避免重复代码,开发人员将实际调用该方法的函数打包为一个单独的函数=>又一个函数调用。
因此,您看到的开销是两个函数调用和一个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)

10-07 13:11