问题描述
我正在尝试实施 spectral-norm 基准测试游戏,以下是我的 Raku 实施。它紧跟 Python 实现 here。它产生正确的结果,但是,它是如此缓慢。例如,当输入为 200 时,Python 运行大约 1.3 秒,而 Raku 在我的笔记本电脑中运行大约 6.4 秒。任何人有任何好的做法来提高其性能?
sub A(\i,\j) {
1e0 / ((i+j)*(i+j+1e0)/2e0 + i + 1e0)
}
sub Av(@v,\i) {
[+] ( -> \j { A(i,j) * @v[j] } for ^@v.elems );
}
sub Atv(@v,\i) {
[+] ( -> \j { A(j,i) * @v[j] } for ^@v.elems );
}
my $*SCHEDULER = ThreadPoolScheduler.new(:max_threads(4));
sub AtAv (@v) {
my @u-promise = (^@v.elems).map(-> \i { start Av(@v,i) });
my @u = await @u-promise;
my @w-promise = (^@u.elems).map(-> \i { start Atv(@u,i) });
await @w-promise;
}
multi sub MAIN(Int $n) {
my @u := (1e0 xx $n).list;
my @v;
for ^10 {
@v := AtAv(@u);
@u := AtAv(@v);
}
my $a = start { [+] @u [Z*] @v };
my $b = start { [+] @v [Z*] @v };
printf "%.9f",($a.result / $b.result).sqrt;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)