Thread Bei "for" durch einen Array delete auf sich selbst anwenden (5 answers)
Opened by Gast at 2008-10-20 13:25

Linuxer
 2008-10-20 14:55
#115652 #115652
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Verdammte Neugier:

Bei Verwendung eines Vergleichs ist die grep Suche etwas schneller.

quick'n'dirty benchmarked:

Code: (dl )
1
2
3
4
5
6
@list has 17576 elements!
Rate grep_re splice_re splice_eq grep_eq
grep_re 24.6/s -- -36% -46% -53%
splice_re 38.6/s 57% -- -16% -27%
splice_eq 45.9/s 87% 19% -- -13%
grep_eq 52.8/s 115% 37% 15% --


Used this dirt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw( cmpthese );


my @list = ( ( 'AAA' .. 'ZZZ' ) x 1 );
my $pattern = 'WVX';

print "\@list has " . @list . " elements!\n";


cmpthese( -2, {
        'grep_eq'   => \&grepped_eq,
        'splice_eq' => \&spliced_eq,
        'grep_re'   => \&grepped_re,
        'splice_re' => \&spliced_re,
} );


sub grepped_eq {
        my @aa = @list;
        @aa = grep { $_ eq $pattern } @aa;
}

sub spliced_eq { 
        my @aa = @list;
        for my $i ( reverse 0 .. $#aa ) {
                splice @aa, $i, 1 if $aa[$i] eq $pattern;
        }
}

sub grepped_re {
        my @aa = @list;
        @aa = grep { m/\Q$pattern\E/ } @aa;
}

sub spliced_re {
        my @aa = @list;
        for my $i ( reverse 0 .. $#aa ) {
                splice @aa, $i, 1 if $aa[$i] =~ m/\Q$pattern\E/;
        }
}

__END__
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Bei "for" durch einen Array delete auf sich selbst anwenden