gpt4 book ai didi

perl - 对存储在哈希中的 AoA 进行操作。 PDL 与无 PDL

转载 作者:行者123 更新时间:2023-12-05 00:44:38 24 4
gpt4 key购买 nike

我有一个 AoA 哈希:

$hash{$key} = [ 
[0.0,1.0,2.0],
10.0,
[1.5,9.5,5.5],
];

我需要按如下方式处理:
$err += (($hash{$key}[0][$_]-$hash{key}[2][$_])*$hash{$key}[1])**2 foreach (0 .. 2);

计算两个数组之间的加权平方差。由于我的散列很大,我希望 PDL 可以帮助加快计算速度,但由于某种原因它没有。我还是 PDL 的新手,所以我可能会搞砸一些事情。下面带有 PDL 的脚本慢了大约 10 倍。描述:以下两个脚本是我试图简单地表示我的程序中发生的事情。我将一些引用值读入散列,然后将观察结果(动态拉入散列中)与这些值进行多次比较,并具有一定的权重。在脚本中,我将引用数组、权重和观察数组设置为一些任意的固定值,但在运行时情况并非如此。

这是两个没有和有 PDL 的简单脚本:

没有 PDL
use strict;
use warnings;
use Time::HiRes qw(time);

my $t1 = time;
my %hash;
my $error = 0;

foreach (0 .. 10000){
$hash{$_} = [
[0.000, 1.000, 2.0000],
10.0,
[1.5,9.5,5.5],
];
foreach my $i (0 .. 2){
$error += (($hash{$_}[0][$i]-$hash{$_}[2][$i])*$hash{$_}[1])**2;
}
}

my $t2 = time;

printf ( "total time: %10.4f error: %10.4f\n", $t2-$t1,$error);

带PDL
use strict;
use warnings;
use PDL;
use Time::HiRes qw(time);

my $t1 = time;
my %hash;
my $error = 0;

foreach (0 .. 10000){
$hash{$_}[0] = pdl[0.000, 1.000, 2.0000];
$hash{$_}[1] = pdl[10.0];
$hash{$_}[2] = pdl[1.5,9.5,5.5];
my $e = ($hash{$_}[0]-$hash{$_}[2])*$hash{$_}[1];
$error += inner($e,$e);
}

my $t2 = time;

printf ( "total time: %10.4f error: %10.4f\n", $t2-$t1, $error);

最佳答案

PDL 经过优化以处理数组计算。您正在为数据使用散列,但由于键是数字,因此可以根据 PDL 数组对象对其进行重新表述,从而大大提高性能。以下示例代码的所有 PDL 版本运行速度比原始 快约 36 倍无 PDL 代码(比原始 和 PDL 代码快 300 倍)。
所有 PDL

use strict;
use warnings;
use PDL;
use Time::HiRes qw(time);

my $t1 = time;
my %hash;
my $error = 0;

my $pdl0 = zeros(3,10001); # create a [3,10001] pdl
$pdl0 .= pdl[0.000, 1.000, 2.0000];

my $pdl1 = zeros(1,10001); # create a [1,10001] pdl
$pdl1 .= pdl[10.0];

my $pdl2 = zeros(3,10001); # create a [3,10001] pdl
$pdl2 .= pdl[1.5,9.5,5.5];

my $e = ($pdl0 - $pdl2)*$pdl1;
$error = sum($e*$e);

my $t2 = time;

printf ( "total time: %10.4f error: %10.4f\n", $t2-$t1, $error);
PDL Book有关使用 PDL 进行计算的深入介绍。 PDL homepage也是所有 PDL 事物的良好起点。

关于perl - 对存储在哈希中的 AoA 进行操作。 PDL 与无 PDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6400553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com