Python 随机高斯向量的快速滚动
对于类似蒙特卡罗的模拟,我需要随机选取数千个随机高斯向量(即具有独立正态分布项的向量)。每个这样的向量都是固定长度的(大约100) NumPy有一种实现这一点的方法: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
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
扩展或任何需要的内容
更新
基于fromcppreference
的非常简单的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