这是一段看似非常特殊的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) 我想编写一个函数,它将采用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)
现在我希望它尽可能快,所以我对此函数有不同的实现:
@njit
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 倍。我的问题是为什么?
-O3
是否足以让我拥有编译器将给我的所有可能的优化?Looped took …
Run Code Online (Sandbox Code Playgroud)