【问题标题】:How to produce random number in a efficient way with c++如何使用 C++ 以有效的方式生成随机数
【发布时间】:2019-03-18 12:29:59
【问题描述】:

我使用 boost 和 QuantLib 来生成一个包含随机数(标准正态分布)的“数组”。但是,我注意到计算性能不是很理想,而且速度比简单地使用 python 的 numpy 慢得多。谁能给我一些建议? 非常感谢。

这是我的 C++ 代码:

using namespace QuantLib;
Array generateRandNumbers(unsigned long seed, Size n) { 
    Array res(n);
    boost::mt19937 rnd(seed); 
    boost::normal_distribution<> normDist(0, 1); 
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<>> generator_norm(rnd, normDist); 
    BOOST_FOREACH(Real& x, res) x = generator_norm();

    return res;
}

int main() 
{
    unsigned long seed = 1; 
    Size n = 1e6;
    boost::timer timer;
    Array randNumbers = generateRandNumbers(seed, n); 
    std::cout << timer.elapsed() << std::endl; 
    return 0
}

这是我的python代码:

import numpy as np
import time

ts = time.time()
res = np.random.normal(0, 1, 1000000); 
print(time.time() - ts)

【问题讨论】:

  • 您好堆栈溢出 (SO)。 SO 的我们很乐意为您提供帮助,但请遵守我们的规则,让我们更轻松。考虑通读Help 并使用Tour。尤其要考虑通读How do I ask a good question?How to create a Minimal, Complete, and Verifiable example
  • 您是否在启用优化的情况下编译了 C++ 代码?每个项目的结果如何?
  • @Caleth 在这种情况下,我们缺少有关编译器、发布/调试构建类型、优化标志、特定基准测试结果和硬件的关键信息。
  • 在我对C++ 代码稍作修改的测试中(使用std:: 不提升),它们的运行速度大致相同,C++ 稍快。
  • @Caleth 我不想刻薄之类的......我只想指出,如果没有支持的详细信息,我们无法找到答案

标签: python c++ numpy boost


【解决方案1】:

你问:

谁能给我一些建议?

编程语言在这里不太可能是主要因素。因此,这个问题归结为其他参数:

  1. 使用的随机数算法(例如 Mersenne Twister)
  2. 可能影响性能的算法的实现细节
  3. 如何编译、链接和运行代码。 (发布、调试会话、编译器优化)

至于最后一点 - 确保在进行比较时始终使用优化的发布版本。

【讨论】:

  • “我们都知道 c++ 的速度与 Python 一样快或可能更快。”需要引用。 numpy 的一大优势是它高度优化
  • @Caleth ..如果我没记错的话,用 c/c++ 实现?
  • 我的主要观点是 语言 不快也不慢。 语言实现是。 c/c++ 不是一个东西。 C 是一种与 C++ 截然不同的语言
  • @Caleth 对我来说 darune 并不是暗示在称为 C/C++ 的语言中有实现。他暗示它已在其中任何一个中实施。我知道“C/C++”是一个敏感话题,但不要忘记/ 可以在句子结构中也代表逻辑。但我完全同意 实现 是关键,而不是 语言 本身。
  • @Caleth 只是,很多时候,许多主流 python 库都是使用 c/c++ 作为 goto 语言实现的,因为在语言本身(Python)中实现太慢了——而且OP似乎暗示python示例以某种方式更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2015-12-19
  • 1970-01-01
  • 2012-01-06
  • 2015-10-13
相关资源
最近更新 更多