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

标签 python performance numpy

最近我发现有人使用 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 调用的结果。 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)

关于python - 为什么 numpy.ndarray.T 比 numpy.transpose(numpy.ndarray) 快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41993187/

相关文章:

python - 快速检查列表中的数字是否在给定范围内的方法

python - 在 python 中对参数进行操作的嵌套函数装饰器

performance - 调用门和陷阱门之间有速度差异吗?

python - 删除由相同数字组成的列表元素

python - 计算两个已比对序列之间的同一性百分比

mysql - SQL/MySQL 中 OR 条件的数量

scala - Scala 惯用的编码风格只是编写低效代码的一个很酷的陷阱吗?

python - Numpy 翻转坐标系

python - 解决 Numpy 中的广义特征值问题

python - 对具有 NaN 值的 Numpy 数组进行反向排序