我在 perl http://en.wikipedia.org/wiki/Fisher_information中实现了以下统计计算。
结果是正确的。我知道这一点是因为我有 100 个匹配输入和输出的测试用例。问题是我每次运行脚本时都需要计算多次。对该函数的平均调用次数约为 530。我使用 Devel::NYTProf 找出了这一点以及慢速部分的位置。我已经优化了算法,只遍历矩阵的上半部分并将其反射到底部,因为它们是相同的。我不是 perl 专家,但我需要知道是否有什么可以尝试加快 perl 的速度。该脚本分发给客户端,因此编译 C 文件不是一种选择。我可以尝试另一个 perl 库吗?如果可能的话,这需要亚秒级的速度。
更多信息是 $MatrixRef 是一个浮点数矩阵,它是 $rows by $variables。这是该函数的 NYTProf 转储。
#-----------------------------------------------
#
#-----------------------------------------------
sub ComputeXpX
# spent 4.27s within ComputeXpX which was called 526 times, avg 8.13ms/call:
# 526 times (4.27s+0s) by ComputeEfficiency at line 7121, avg 8.13ms/call
{
526 0s my ($MatrixRef, $rows, $variables) = @_;
526 0s my $r = 0;
526 0s my $c = 0;
526 0s my $k = 0;
526 0s my $sum = 0;
526 0s my @xpx = ();
526 11.0ms for ($r = 0; $r < $variables; $r++)
{
14202 19.0ms my @temp = (0) x $variables;
14202 6.01ms push(@xpx, \@temp);
526 0s }
526 7.01ms for ($r = 0; $r < $variables; $r++)
{
14202 144ms for ($c = $r; $c < $variables; $c++)
{
198828 43.0ms $sum = 0;
#for ($k = 0; $k < $rows; $k++)
198828 101ms foreach my $RowRef (@{$MatrixRef})
{
#$sum += $MatrixRef->[$k]->[$r]*$MatrixRef->[$k]->[$c];
6362496 3.77s $sum += $RowRef->[$r]*$RowRef->[$c];
}
198828 80.1ms $xpx[$r]->[$c] = $sum;
#reflect on other side of matrix
198828 82.1ms $xpx[$c]->[$r] = $sum if ($r != $c);
14202 1.00ms }
526 2.00ms }
526 2.00ms return \@xpx;
}