我正在计算一组中两个项目具有相同值的概率(类似于生日问题,http://en.wikipedia.org/wiki/Birthday_problem)。为此,我有24组三个值。该组中的每个项目将从24组中的每个组中选择一个值。我需要进行的计算是获取所有可能迭代这些值的乘积平方和。显然,这种迭代非常密集,因为必须进行迭代。在SE的帮助下,我现在已经得到:
基于上述代码中的13组子集的快速基准测试,我估计在我的个人电脑上完整运行这24组数据需要约45天。是否有任何建议可以提高性能?我不是寻求奇迹,只要它能在一周内完成,我就会很满意...
我对Perl没有情感投入,所以如果有明显的性能优势,可以尝试转向其他语言。
感谢您提前给出的任何建议。
编辑:添加了R标签,因为那可能是我能实现解决方案的第二佳选择。
#!perl;
use List::Util qw(reduce);
use Set::CrossProduct;
my @array = ( ## AoA containing values for caluculation, cut-down to allow benchmarking
# [0.33, 0.33, 0.33], x11 more in full set
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33],
[0.33, 0.33, 0.33]
);
$val = 0;
my $iterator = Set::CrossProduct->new(\@array);
while (my $tuple = $iterator->get) {
$freq = reduce { $a * $b } @$tuple;
$val += ($freq*$freq);
}
$toprint=sprintf("%.50e", $val);
print $toprint;
基于上述代码中的13组子集的快速基准测试,我估计在我的个人电脑上完整运行这24组数据需要约45天。是否有任何建议可以提高性能?我不是寻求奇迹,只要它能在一周内完成,我就会很满意...
我对Perl没有情感投入,所以如果有明显的性能优势,可以尝试转向其他语言。
感谢您提前给出的任何建议。
编辑:添加了R标签,因为那可能是我能实现解决方案的第二佳选择。
$freq =1; $freq *= $_ for @$tuple;
这行代码可以替代$freq = reduce { $a * $b } @$tuple;
。 - mpapec