【发布时间】:2018-01-30 10:52:59
【问题描述】:
我写了一小段代码来生成一个整数序列,并将其与np.arange() 进行比较,我发现np.arange() 更快。如果有更快的 C++ 实现,任何人都可以给我一些提示吗?
代码如下:
#include <iostream>
#include <chrono>
#include <ctime>
#include <array>
#include <vector>
#include <numeric>
template <typename T>
std::vector<T> range(T start, T end) {
size_t N = (int)floor(end - start) + 1;
std::vector<T> vec(N);
std::iota(vec.begin(), vec.end(), start);
return vec;
}
int main() {
auto start = std::chrono::system_clock::now();
std::vector<int> x_range = range(0, 1024);
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
}
Python 代码很简单:
%timeit x = np.arange(0, 1024)
Python 时间:1.51e-6 s
C++时间:1.6e-5 s
在这里,Python 比 C++ 实现快 10 倍。
平台:
Win10,Visual Studio Community 2017,O2 和 Ox 优化模式。两者的时间顺序大致相同-1.x e-5 s。
【问题讨论】:
-
您确定要使用优化的构建进行测试吗?你使用什么编译器标志?
-
在包含适当的标头后,我的以
-O2和-O3以 0 结束。 -
至少有一件 C++ 版本正在做的事情是 numpy 可能没有做到的:在填充缓冲区之前对其进行零初始化。
-
认真的吗? 1.5微秒和16微秒?对如此小的单个工作负载的测量永远不会可靠。
-
循环调用你的'range`函数1 000 000次。