Numpy移调功能可加快速度和使用案例

发布于 2021-01-29 15:01:40

那么,为什么NumPy的转置.T速度比np.transpose()

b = np.arange(10)

#Transpose .T
t=b.reshape(2,5).T

#Transpose function
t = np.transpose(b.reshape(2,5))

#Transpose function without wrapper
t = b.reshape(2,5).transpose()

timeit在Jupyter中都做到了:

%timeit -n 1000 b.reshape(2,5).T

1000 loops, best of 3: 391 ns per loop

%timeit -n 1000 np.transpose(b.reshape(2,5))

1000 loops, best of 3: 600 ns per loop

%timeit -n 1000 b.reshape(2,5).transpose()

1000 loops, best of 3: 422 ns per loop

为了检查可扩展性,我做了一个更大的矩阵:

b = np.arange( 100000000)

%timeit -n 1000 b.reshape(10000,10000).T

1000 loops, best of 3: 390 ns per loop

%timeit -n 1000 np.transpose(b.reshape(10000,10000))

1000 loops, best of 3: 611 ns per loop

%timeit -n 1000 b.reshape(10000,10000).transpose()

1000 loops, best of 3: 435 ns per loop

在这两种情况下,该.T方法的速度都比包装器快2倍,比使用包装器快.transpose()一点?有没有一种用例会np.transpose更好?

关注者
0
被浏览
83
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    原因之一可能是内部np.transpose(a)调用a.transpose(),而a.transpose()直接调用。在源代码中,您有:

    def transpose(a, axes=None):
        return _wrapfunc(a, 'transpose', axes)
    

    哪里_wrapfunc只是

    def _wrapfunc(obj, method, *args, **kwds):
        try:
            return getattr(obj, method)(*args, **kwds)
        except (AttributeError, TypeError):
            return _wrapit(obj, method, *args, **kwds)
    

    getattr(a, 'transpose')在这种情况下,映射到。
    _wrapfunc许多模块级函数使用来访问方法,通常是ndarray该类的方法或第一个arg的类。

    (注意:.T与相同.transpose(),但如果数组的尺寸小于2,则返回该数组。)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看