【问题标题】:Comparison of np.arange with C++ iota, iota is slowernp.arange 与 C++ iota 的比较,iota 较慢
【发布时间】: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次。

标签: python c++ numpy stl


【解决方案1】:

谢谢大家,虽然是一道简单的题,但我还是学到了很多。

这里是新代码,与问题中的代码不同,也许同情心会帮助一些新手更好地理解:

#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。

【讨论】:

  • 这段代码是错误的:reserve 不会改变 vec.end(),所以你的 std::iota 没有做任何事情。
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多