小编Ben*_*Ben的帖子

为什么 numba 这么快?

我想编写一个函数,它将采用lefts形状索引(N_ROWS,)我想编写一个函数,它将创建一个矩阵out = (N_ROWS, N_COLS)矩阵,使得out[i, j] = 1当且仅当j >= lefts[i]。在循环中执行此操作的一个简单示例如下:

class Looped(Strategy):
    def copy(self, lefts):
        out = np.zeros([N_ROWS, N_COLS])
        for k, l in enumerate(lefts): 
            out[k, l:] = 1
        return out
Run Code Online (Sandbox Code Playgroud)

现在我希望它尽可能快,所以我对此函数有不同的实现:

  1. 简单的Python循环
  2. numba 与@njit
  3. 我调用的纯 C++ 实现ctypes

以下是 100 次运行的平均结果:

Looped took 0.0011599776260009093
Numba took 8.886413300206186e-05
CPP took 0.00013200821400096175
Run Code Online (Sandbox Code Playgroud)

因此 numba 大约是第二快的实现(即 C++ 实现)的 1.5 倍。我的问题是为什么?

  • 我在类似的问题中听说过 cython 速度较慢,因为它没有使用设置的所有优化标志进行编译,但是编译 cpp 实现-O3是否足以让我拥有编译器将给我的所有可能的优化?
  • 我不完全理解如何将 numpy 数组交给 c++,我是否无意中在此处复制了数据?

Looped took …
Run Code Online (Sandbox Code Playgroud)

c++ python numpy cython numba

7
推荐指数
1
解决办法
2464
查看次数

标签 统计

c++ ×1

cython ×1

numba ×1

numpy ×1

python ×1