Python 随机高斯向量的快速滚动

Python 随机高斯向量的快速滚动,python,c,optimization,numpy,random,Python,C,Optimization,Numpy,Random,对于类似蒙特卡罗的模拟,我需要随机选取数千个随机高斯向量(即具有独立正态分布项的向量)。每个这样的向量都是固定长度的(大约100) NumPy有一种实现这一点的方法: import numpy.random vectors = [numpy.random.normal(size=100) for _ in xrange(10000)] NumPy的random.normal函数具有线性复杂度,对于较小的值有开销。然而,对于size=100,开销似乎并不显著(根据经验测试,大约30%;与size

对于类似蒙特卡罗的模拟,我需要随机选取数千个随机高斯向量(即具有独立正态分布项的向量)。每个这样的向量都是固定长度的(大约100)

NumPy有一种实现这一点的方法:

import numpy.random
vectors = [numpy.random.normal(size=100) for _ in xrange(10000)]
NumPy的
random.normal
函数具有线性复杂度,对于较小的值有开销。然而,对于
size=100
,开销似乎并不显著(根据经验测试,大约30%;与
size=1
的开销相比,大约2300%)。也许我可以通过滚动一次,然后拆分数组(还没有尝试过)来节省一些开销

然而,对于我的需求来说,它仍然太慢了。也许我在这里太贪心了;我知道NumPy的随机化函数是用
c
编写的,考虑到了优化;尽管如此

timeit numpy.random.normal(size=100)
# 100000 loops, best of 3: 5.8 us per loop
(在IPython内部测试,使用其魔力
%timeit

对于10k矢量,这大约需要0.06秒。我想知道是否有一种更快的方法可以让我在不到0.6ms的时间内滚动10k大小为100的向量,也就是说,快100倍。解决方案可能涉及
c
扩展或任何需要的内容

更新 基于from
cppreference
的非常简单的
c++
代码显示了更好的性能:

#include <iostream>
#include <random>

int main()
{
    float x;

    std::random_device rd;
    std::mt19937 gen(rd());
    std::normal_distribution <> d(0,1);

    for(int i=0; i < 100000; i++)
    {
      x = d(gen);
    }
    std::cout << x << '\n';

    return 0;
}

这比NumPy给出的速度快约X20倍。然而,我不确定python的c扩展的开销,我也不知道这是否能成为一个比
numpy.random.normal
np.random.randn(10010000)
@behzad.nouri更快的python函数:谢谢你的回复!然而,这只将我的0.06秒提高到了0.04秒左右,与我所希望的相去甚远。使用numpy>=1.9,您可以使用线程来加速它,但它不能比使用numpy更快。numpy使用box-muller方法,使用ziggurat方法使用cextension可能会获得更好的性能。@jtaylor-谢谢;我相信这将远远超出我的
c
技能。然而,这可能是一个很好的方向。你的随机数应该有多正常,也就是说,你的分布会有多大的误差。这只是“大致正常”吗?那么也许有办法加快速度。
real    0m0.028s
user    0m0.020s
sys     0m0.004s