相关疑难解决方法(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万
查看次数

快速检查NumPy中的NaN

我正在寻找检查np.nanNumPy数组中NaN()出现的最快方法X.np.isnan(X)是不可能的,因为它构建了一个布尔形状的数组X.shape,这可能是巨大的.

我试过了np.nan in X,但这似乎不起作用,因为np.nan != np.nan.有没有一种快速且节省内存的方法来完成这项工作?

(对于那些会问"多么巨大"的人:我说不出来.这是图书馆代码的输入验证.)

python numpy nan

107
推荐指数
6
解决办法
11万
查看次数

为什么numpy.any对大型数组这么慢?

我正在寻找一种最有效的方法来确定一个大型数组是否包含至少一个非零值.乍一看np.any似乎是这项工作的明显工具,但对大型阵列来说似乎意外地缓慢.

考虑这种极端情况:

first = np.zeros(1E3,dtype=np.bool)
last = np.zeros(1E3,dtype=np.bool)

first[0] = True
last[-1] = True

# test 1
%timeit np.any(first)
>>> 100000 loops, best of 3: 6.36 us per loop

# test 2
%timeit np.any(last)
>>> 100000 loops, best of 3: 6.95 us per loop
Run Code Online (Sandbox Code Playgroud)

至少np.any在这里似乎做了一些模糊的事情 - 如果非零值是数组中的第一个True,那么在返回之前不应该考虑任何其他值,所以我希望测试1比测试2稍快一些.

但是,当我们使阵列更大时会发生什么?

first = np.zeros(1E9,dtype=np.bool)
last = np.zeros(1E9,dtype=np.bool)

first[0] = True
last[-1] = True

# test 3
%timeit np.any(first)
>>> 10 loops, best of 3: 21.6 ms per …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy

45
推荐指数
1
解决办法
3605
查看次数

为什么CPU分支指令慢?

自从我开始编程以来,我已经在每个地方阅读,以避免不惜一切代价浪费分支机构.

这很好,虽然没有一篇文章解释了为什么我应该这样做.CPU解码分支指令并决定跳转时到底发生了什么?什么是"东西"使它比其他指令(如添加)慢?

language-agnostic architecture compiler-construction cpu optimization

30
推荐指数
2
解决办法
9164
查看次数