In my quest to learn PDL, I am trying out simple problems. Recently
someone asked on Perlmonks the following question -- given a 3 x 100K
array of arrays, how to 'push' a fourth value into each array
calculated from the 1st and second elements. That is, given

[
    [x1, y1, z1],
    [x2, y2, z2]
    ..
    [x100K, y100K, z100K]
]

get

[
    [x1, y1, z1, n1],
    [x2, y2, z2, n2]
    ..
    [x100K, y100K, z100K, n100K]
]

where nn = (xn ** 2 + yn ** 2) ** 0.5

So, I piped in and suggested PDL. Given $a, a 3 x 100K piddle

# add a fourth column to hold the calculated values
$b = $a->append( zeros(1, 100000) );

# calc the value
$b->slice('3,:') .= (($b->slice('0,:') ** 2) + ($b->slice('1,:') ** 2)) ** 0.5;

Then I was curious if PDL brought any speed advantage to this
calculation. So, I wrote a little script

for my $c (10000, 100000, 1000000, 2000000, 3000000) {

    my @dat = ();
    for (1 .. $c) {
        push @dat, [int(rand(10)), int(rand(10)), int(rand(10))];
    }

    by_pdl(\...@dat, $c);
    #by_arr(\...@dat, $c);

}


sub by_arr {
    my $t0 = time();

    my ($dat, $count) = @_;

    for (@$dat) {
        push @$_, (($_->[0] ** 2) + ($_->[1] ** 2)) ** 0.5;
    }

    my $t1 = time();

    print "arr $count: " . ($t1 - $t0) . " secs\n";
}

sub by_pdl {
    my $t0 = time();

    my ($dat, $count) = @_;

    my $a = pdl @$dat;

    my $b = $a->append( zeros(1, $count) );
    $b->slice('3,:') .= (($b->slice('0,:') ** 2) + ($b->slice('1,:')
** 2)) ** 0.5;

    my $t1 = time();

    print "pdl $count: " . ($t1 - $t0) . " secs\n";
}

Here is what I got

punk...@lucknow ~$perl arr_v_pdl.pl
arr   10000: 0.00679993629455566 secs
arr  100000: 0.0664570331573486 secs
arr 1000000: 0.673020124435425 secs
arr 2000000: 1.33305907249451 secs
arr 3000000: 2.01763200759888 secs

punk...@lucknow ~$perl arr_v_pdl.pl
pdl   10000: 0.00865507125854492 secs
pdl  100000: 0.102356910705566 secs
pdl 1000000: 1.04948401451111 secs
pdl 2000000: 2.03625702857971 secs
pdl 3000000: 13.5644547939301 secs

As potentially embarrassing as it may be for me, I ask you -- am I
doing something very wrong and silly? Otherwise please explain why PDL
is so much slower than Perl.

-- 
Puneet Kishor

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to