Thread in_array() - Funktion bauen (25 answers)
Opened by Gast at 2005-10-13 15:58

pq
 2005-10-14 02:23
#58785 #58785
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
also mein rechner tickt da anders:
list:util.pl:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use warnings;
my @x = (0..$ARGV[0]||1000);
my $f = $ARGV[1] || 500;
use Benchmark;
use List::Util qw(first);
Benchmark::timethese(-1, {
       Grep => sub{my $y  = grep {$_ == $f} @x},
       Util => sub {my $y = first {$_ == $f} @x}
   }
);

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> perl list_util.pl 1000 1   
Benchmark: running Grep, Util for at least 1 CPU seconds...
     Grep:  1 wallclock secs ( 1.06 usr +  0.00 sys =  1.06 CPU) @ 4830.19/s (n=5120)
     Util:  1 wallclock secs ( 0.94 usr +  0.14 sys =  1.08 CPU) @ 176987.04/s (n=191146)
> perl list_util.pl 1000 500
Benchmark: running Grep, Util for at least 1 CPU seconds...
     Grep:  1 wallclock secs ( 1.07 usr +  0.00 sys =  1.07 CPU) @ 4785.05/s (n=5120)
     Util:  1 wallclock secs ( 1.05 usr +  0.01 sys =  1.06 CPU) @ 11269.81/s (n=11946)
> perl list_util.pl 1000 1000
Benchmark: running Grep, Util for at least 1 CPU seconds...
     Grep:  1 wallclock secs ( 1.06 usr +  0.00 sys =  1.06 CPU) @ 4830.19/s (n=5120)
     Util:  1 wallclock secs ( 1.06 usr +  0.01 sys =  1.07 CPU) @ 5910.28/s (n=6324)
> perl list_util.pl 1000 1001
Benchmark: running Grep, Util for at least 1 CPU seconds...
     Grep:  1 wallclock secs ( 1.12 usr +  0.00 sys =  1.12 CPU) @ 4799.11/s (n=5375)
     Util:  2 wallclock secs ( 1.07 usr +  0.01 sys =  1.08 CPU) @ 5855.56/s (n=6324)

List::Util ist bei mir immer schneller.
(edit: auch bei unsortierten listen wie in deinem beispiel mit deinen werten
ist hier List::Util immer schneller)
aber das ist anscheinend plattform-abhängig.
ich habe perl 5.8.6, Linux 2.6.4-52-default.
wie nun die liste und der gesuchte wert beschaffen sind, ist natürlich
eine frage der statistik.
kommt der wert auf jeden fall vor, kann man im allgemeinen davon ausgehen,
der gesuchte wert ist im schnitt in der mitte der liste.
sind die werte anders verteilt und/oder unsortiert, kommt das eben immer speziell auf die verteilung an.
wird es kompliziert, ist man mit dieser lösung vermutlich sowieso auf
dem holzweg, und man sollte über eine indizierung nachdenken =)\n\n

<!--EDIT|pq|1129242586-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread in_array() - Funktion bauen