![](/img/trans.png)
[英]What's the difference of numpy.ndarray.T and numpy.ndarray.transpose() when self.ndim < 2
[英]Why is numpy.ndarray.T so much faster than numpy.transpose(numpy.ndarray)?
最近我遇到了一个使用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
最后调用对象.transpose
-method这意味着它必须查找对象的方法并调用它。 所以你看到的开销是2个函数调用和getattr
-call的结果。 np.transpose
函数实际上是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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.