Skip to content

Commit 5f0c5d7

Browse files
committed
speed-up PDL::Factor and PDL::SV's new() a little bit
1 parent 1a3a962 commit 5f0c5d7

File tree

6 files changed

+70
-54
lines changed

6 files changed

+70
-54
lines changed

Changes

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
Revision history of Alt-Data-Frame-ButMore
22

3+
0.0050_02 2019-05-29
4+
- Speed-up PDL::Factor and PDL::SV's new() a little bit. In this work we
5+
removed Data::Rmap from dependencies. Data::Rmap has a lot overhead.
6+
37
0.0050_01 2019-05-29
48
- Fix PDL::Factor's repeat() method.
59
- Fix Data::Frame's comparison on negative numerical values.

cpanfile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
requires "Carp" => "0";
22
requires "Class::Method::Modifiers" => "0";
33
requires "Data::Dumper" => "0";
4-
requires "Data::Rmap" => "0";
54
requires "Devel::OverloadInfo" => "0.005";
65
requires "Eval::Quosure" => "0.001001";
76
requires "Exporter::Tiny" => "0";
@@ -35,7 +34,6 @@ requires "Safe::Isa" => "1.000009";
3534
requires "Scalar::Util" => "0";
3635
requires "Sereal::Decoder" => "4.005";
3736
requires "Sereal::Encoder" => "4.005";
38-
requires "Storable" => "0";
3937
requires "Syntax::Keyword::Try" => "0.09";
4038
requires "Test2::API" => "0";
4139
requires "Test2::Util::Ref" => "0";

dist.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author = Stephan Loyd <[email protected]>
44
license = Perl_5
55
copyright_holder = Zakariyya Mughal, Stephan Loyd
66
copyright_year = 2014, 2019
7-
version = 0.0050_01
7+
version = 0.0050_02
88

99
; authordep Pod::Weaver::PluginBundle::SLOYD = 0.0005
1010
; authordep Pod::POM = 2.01

lib/PDL/Factor.pm

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@ use PDL::Lite (); # PDL::Lite is the minimal to get PDL work
1111
use PDL::Core qw(pdl);
1212
use PDL::Primitive qw(which);
1313

14-
use Data::Rmap qw(rmap);
1514
use Module::Load;
1615
use Ref::Util qw(is_plain_arrayref);
1716
use Safe::Isa;
18-
use Storable qw(dclone);
1917
use Scalar::Util qw(blessed);
2018
use Type::Params;
2119
use Types::Standard qw(slurpy ArrayRef ConsumerOf Int);
@@ -99,21 +97,28 @@ sub new {
9997
return $data->copy;
10098
}
10199

100+
#TODO: this does not support ND piddle yet.
101+
102102
# reorder levels
103103
my @levels = @{ delete $opt{levels} };
104104
my @integer_old = $data->{PDL}->list;
105-
my $i = 0;
106-
my %levels_old = map { $i++ => $_ } @{ $data->levels };
107-
$i = 0;
108-
my %levels_new = map { $_ => $i++ } @levels;
109-
my @integer_new = map {
110-
my $enum = $levels_old{$_};
111-
defined $enum ? $levels_new{$enum} : -1;
112-
} @integer_old;
113-
114-
my $new = $class->new( \@levels, levels => \@levels, %opt );
105+
my @levels_old = @{ $data->levels };
106+
my %levels_new = do {
107+
my $i = 0;
108+
map { $_ => $i++ } @levels;
109+
};
110+
my @integer_new = do {
111+
no warnings 'numeric';
112+
map {
113+
my $level = $levels_old[$_];
114+
defined $level ? $levels_new{$level} : -1;
115+
} @integer_old;
116+
};
117+
118+
my $new = $class->new( [ $levels[0] ], levels => \@levels, %opt );
115119
my $p = PDL::Core::indx( \@integer_new );
116-
$new->{PDL} = $p->setbadif( $p < 0 );
120+
$p = $p->setbadif( $data->isbad ) if $data->badflag;
121+
$new->{PDL} = $p;
117122
return $new;
118123
}
119124

@@ -132,12 +137,20 @@ sub new {
132137
$levels = $class->_extract_levels($enum);
133138
}
134139

135-
$enum = $enum->$_DOES('PDL') ? $enum->unpdl : dclone($enum);
136-
my $i = 0;
137-
my %levels = map { $_ => $i++; } @$levels;
138-
rmap {
139-
$_ = ($levels{$_} // -1); # assign index of level
140-
} $enum;
140+
# this is faster than Data::Rmap::rmap().
141+
state $rmap = sub {
142+
my ( $x, $levels ) = @_;
143+
is_plain_arrayref($x)
144+
? [ map { __SUB__->( $_, $levels ) } @$x ]
145+
: ( $levels->{$x} // -1 );
146+
};
147+
148+
my %levels = do {
149+
my $i = 0;
150+
map { $_ => $i++; } @$levels;
151+
};
152+
$enum =
153+
$rmap->( ( $enum->$_DOES('PDL') ? $enum->unpdl : $enum ), \%levels );
141154

142155
my $self = $class->initialize();
143156

lib/PDL/Logical.pm

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use warnings;
88
use PDL::Lite (); # PDL::Lite is the minimal to get PDL work
99
use PDL::Core qw(pdl);
1010

11-
use Data::Rmap qw(rmap_array);
11+
use Ref::Util qw(is_plain_arrayref);
1212
use Safe::Isa;
1313

1414
use parent 'PDL';
@@ -26,14 +26,17 @@ sub new {
2626
if ( $data->$_DOES('PDL') ) {
2727
$data = !!$data;
2828
}
29-
elsif ( ref($data) eq 'ARRAY' ) {
30-
my ($data1) = rmap_array {
31-
( ref( $_->[0] ) eq 'ARRAY' )
32-
? [ $_[0]->recurse() ]
33-
: [ map { $_ ? 1 : 0 } @$_ ];
34-
}
35-
$data;
36-
$data = pdl($data1);
29+
elsif ( is_plain_arrayref($data) ) {
30+
31+
# this is faster than Data::Rmap::rmap().
32+
state $rmap = sub {
33+
my ($x) = @_;
34+
is_plain_arrayref($x)
35+
? [ map { __SUB__->($_) } @$x ]
36+
: ( $x ? 1 : 0 );
37+
};
38+
39+
$data = pdl( $rmap->($data) );
3740
}
3841
else {
3942
$data = pdl( $data ? 1 : 0 );

lib/PDL/SV.pm

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use PDL::Lite (); # PDL::Lite is the minimal to get PDL work
99
use PDL::Core qw(pdl);
1010
use PDL::Primitive qw(which whichND);
1111

12-
use Data::Rmap qw(rmap_array);
13-
use Ref::Util;
12+
use Ref::Util qw(is_plain_arrayref);
1413
use Safe::Isa;
1514
use Type::Params;
1615
use Types::Standard qw(slurpy ArrayRef ConsumerOf Int);
@@ -79,12 +78,14 @@ sub new {
7978
my ( $class, @args ) = @_;
8079
my $data = shift @args; # first arg
8180

82-
my ($faked_data) = rmap_array {
83-
Ref::Util::is_plain_arrayref( $_->[0] )
84-
? [ $_[0]->recurse() ]
85-
: [ (0) x @$_ ]
86-
}
87-
$data;
81+
state $rmap = sub {
82+
my ( $x ) = @_;
83+
is_plain_arrayref($x)
84+
? [ map { __SUB__->( $_ ) } @$x ]
85+
: 0;
86+
};
87+
88+
my $faked_data = $rmap->($data);
8889

8990
my $self = $class->initialize();
9091
my $pdl = $self->{PDL};
@@ -259,22 +260,19 @@ sub at {
259260
sub unpdl {
260261
my $self = shift;
261262

262-
my $data = $self->{PDL}->unpdl;
263+
state $rmap = sub {
264+
my ( $x, $f ) = @_;
265+
is_plain_arrayref($x)
266+
? [ map { __SUB__->( $_, $f ) } @$x ]
267+
: $f->($x);
268+
};
269+
263270
my $internal = $self->_internal;
264-
if ($self->ndims == 1) { # for speed
265-
my $f =
266-
$self->badflag
267-
? sub { $_ eq 'BAD' ? 'BAD' : $internal->[$_] }
268-
: sub { $internal->[$_] };
269-
$data = [ map { $f->($_) } @$data ];
270-
} else {
271-
my $f =
272-
$self->badflag
273-
? sub { $_ = ( $_ eq 'BAD' ? 'BAD' : $internal->[$_] ); }
274-
: sub { $_ = $internal->[$_] };
275-
Data::Rmap::rmap_scalar { $f->($_) } $data;
276-
}
277-
return $data;
271+
my $f =
272+
$self->badflag
273+
? sub { $_ eq 'BAD' ? 'BAD' : $internal->[$_] }
274+
: sub { $internal->[$_] };
275+
return $rmap->( $self->{PDL}->unpdl, $f );
278276
}
279277

280278
=head2 list

0 commit comments

Comments
 (0)