在基准游戏中提高谱范数性能的任何技巧

max*_*c01 7 rakudo raku

我正在尝试实现光谱范数基准游戏,下面是我的 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)