相关疑难解决方法(0)

为什么处理排序数组比处理未排序数组更快?

这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned c = 0; c < arraySize; ++c)
        data[c] = std::rand() % 256;

    // !!! With this, the next loop runs faster.
    std::sort(data, data + arraySize);

    // Test
    clock_t start = clock();
    long long sum = 0;

    for (unsigned i = 0; i < 100000; ++i)
    {
        // Primary loop
        for (unsigned c = 0; c < arraySize; ++c) …
Run Code Online (Sandbox Code Playgroud)

c++ java optimization performance branch-prediction

2万
推荐指数
27
解决办法
142万
查看次数

为什么 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
查看次数