繁体   English   中英

为什么numpy.ndarray.T比numpy.transpose(numpy.ndarray)快得多?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM