我正在尝试实现光谱范数基准游戏,下面是我的 Raku 实现。它严格遵循此处的 Python 实现。它产生正确的结果,但是,它是如此缓慢。例如,当输入为 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;
}
Run Code Online (Sandbox Code Playgroud)