这是一段看似非常特殊的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) 我正在寻找检查np.nanNumPy数组中NaN()出现的最快方法X.np.isnan(X)是不可能的,因为它构建了一个布尔形状的数组X.shape,这可能是巨大的.
我试过了np.nan in X,但这似乎不起作用,因为np.nan != np.nan.有没有一种快速且节省内存的方法来完成这项工作?
(对于那些会问"多么巨大"的人:我说不出来.这是图书馆代码的输入验证.)
我正在寻找一种最有效的方法来确定一个大型数组是否包含至少一个非零值.乍一看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) 自从我开始编程以来,我已经在每个地方阅读,以避免不惜一切代价浪费分支机构.
这很好,虽然没有一篇文章解释了为什么我应该这样做.CPU解码分支指令并决定跳转时到底发生了什么?什么是"东西"使它比其他指令(如添加)慢?
language-agnostic architecture compiler-construction cpu optimization
numpy ×2
optimization ×2
performance ×2
python ×2
architecture ×1
arrays ×1
c++ ×1
cpu ×1
java ×1
nan ×1