我编写了一小段代码来生成一个整数序列,并将其与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
。
答案 0 :(得分:0)
谢谢大家,虽然这是一个简单的问题,但我仍然学到很多东西。
这是新代码,与问题中的代码不同,也许慈悲会帮助一些新手更好地理解:
#include <iostream>
#include <chrono>
#include <ctime>
#include <array>
#include <vector>
#include <numeric>
#include <iostream>
template <typename T>
std::vector<T> range(T start, T end) {
size_t N = (int)floor(end - start);
std::vector<T> vec;
vec.reserve(N);
std::iota(vec.begin(), vec.end(), start);
return vec;
}
int main() {
auto start = std::chrono::system_clock::now();
for (int i = 0; i < 100000000; ++i) {
std::vector<int> x_range = range(0, 1000);
}
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";
system("pause");
}
现在C ++实现时间:7.14136e-8 s。