小编Vin*_*ara的帖子

Haskell中的懒惰笛卡尔积

我想在Haskell中生成一个相当大但有限的笛卡尔积,然后我需要迭代(想想平均场模型的分区函数).自然要做的事情sequence,像这样:

l = sequence $ replicate n [0,1,2]
Run Code Online (Sandbox Code Playgroud)

不幸的是,对于大型n,这不适合内存,一旦我要求,我就会用完堆length l.我需要一种方法来懒散地做同样的事情.我最终"重新发现"基础3算术,像这样,

nextConfig []     = []
nextConfig (0:xs) = 1:xs
nextConfig (1:xs) = 2:xs
nextConfig (2:xs) = 0:(nextConfig xs)

ll = take (3^n) $ iterate nextConfig $ replicate n 0
Run Code Online (Sandbox Code Playgroud)

(这有效)但感觉就像重新发明轮子一样,而且它太具体了.生成产品会有什么更好的懒惰方式?

haskell

9
推荐指数
1
解决办法
755
查看次数

随机数,C++ 11 vs Boost

我想用C++生成伪随机数,这两个可能的选项是C++ 11和Boost对应的特性.它们的使用方式基本相同,但在我的测试中,原生的大约慢了4倍.

这是由于库中的设计选择,还是我错过了某种方法在某处禁用调试代码?

更新:代码在这里,https://github.com/vbeffara/Simulations/blob/master/tests/test_prng.cpp,如下所示:

cerr << "boost::bernoulli_distribution ...      \ttime = ";
s=0; t=time();
boost::bernoulli_distribution<> dist(.5);
boost::mt19937 boostengine;
for (int i=0; i<n; ++i) s += dist(boostengine);
cerr << time()-t << ",  \tsum = " << s << endl;

cerr << "C++11 style ...                        \ttime = ";
s=0; t=time();
std::bernoulli_distribution dist2(.5);
std::mt19937_64 engine;
for (int i=0; i<n; ++i) s += dist2(engine);
cerr << time()-t << ",  \tsum = " << s << endl;
Run Code Online (Sandbox Code Playgroud)

(使用std::mt19937而不是std::mt19937_64 …

random performance boost c++11

8
推荐指数
1
解决办法
2328
查看次数

Haskell:列表/向量/数组性能调优

我正在尝试使用Haskell来计算统计物理中模型的分区函数.这涉及遍历相当大的配置列表并总结各种可观察量 - 我希望尽可能高效地完成.

我的代码的当前版本在这里:https://gist.github.com/2420539

尝试在列表和向量之间进行选择以枚举配置时会发生一些奇怪的事情; 特别是,截断列表,使用V.toList . V.take (3^n) . V.fromList(where Vis Data.Vector)比使用更快take,这感觉有点违反直觉.在这两种情况下,列表都会被懒惰地评估.

列表本身是使用iterate; 如果相反,我Vector尽可能多地使用s并使用构建列表V.iterateN,再次变得更慢......

我的问题是,有没有办法(除了拼接V.toListV.fromList代码中的随机位置)预测哪一个最快?(顺便说一句,我使用ghc -O2当前的稳定版本编译所有内容.)

optimization haskell vector data-structures

7
推荐指数
1
解决办法
1227
查看次数