これが私が最適化しようとしているサブルーチンです。ほとんどの場合、配列参照を利用します。現在、このサブルーチンには約 10 分かかります。平均して実行するのに 30 ~ 40 秒。可能であれば、これを 10 秒に短縮したいと考えています。不要なものが飛び出しますか?
sub compute{
# takes two params: 2 array_refs
my ($gene_exp_ref, $centroids_ref) = @_;
my ($numerator, $denominator) = 0;
my ($prod_ref, $diff_x_ref, $diff_y_ref, $x_sq_ref, $y_sq_ref) = []; # diff_y is the center_gene
my %gene_center_pcc; # diff_x is gene of interest
my $gene_exp_average = mean($gene_exp_ref);
for my $gene_exp (@{$gene_exp_ref}) {
push(@{ $diff_x_ref }, ($gene_exp - $gene_exp_average));
}
# possible bottleneck
for my $centroid_gene_exp_ref (values %{$centroids_ref}){
$diff_y_ref = []; # initilize back to empty array
for my $index (@{$centroid_gene_exp_ref}) {
push(@{ $diff_y_ref }, ($index - mean($centroid_gene_exp_ref)));
}
@{ $prod_ref } = map { @{ $diff_x_ref }[$_] * @{ $diff_y_ref }[$_] } 0..$#{ $diff_x_ref };
$numerator = sum($prod_ref);
@{ $x_sq_ref } = map {$_*$_}@$diff_x_ref;
@{ $y_sq_ref } = map {$_*$_}@$diff_y_ref;
$denominator = sqrt(sum($x_sq_ref)) * sqrt(sum($y_sq_ref));
my $r = $numerator/$denominator;
my ($center) = grep { @{$gene_centers{$_}} ~~ @$centroid_gene_exp_ref } keys %gene_centers;
$gene_center_pcc{$center} = $r;
}
#return the center with the highest PCC
return (sort {$gene_center_pcc{$b} <=> $gene_center_pcc{$a}}
keys %gene_center_pcc)[0];
}
それぞれの計算と数値計算のステップが必要です。コンパイルはできますが、データ ファイルがないとサブルーチンを適切に使用できません。