Schrift
[thread]8616[/thread]

Werte in Hash und gleichzeitig doppelte finden (Seite 2)

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
bloonix
 2007-01-08 20:41
#72849 #72849
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,08.01.2007, 18:56]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my @a = (0..1000, 0..1000);
Benchmark::timethese($ARGV[0]||-1,{
"shift" => sub {
my (%seen, $string);
my @array = @a;
$seen{$string}++ while defined ($string = shift @array);
for (keys %seen) {
push @array, $_;
delete $seen{$_};
} return @array;
},
"grep" => sub {
my %seen;
my @unique = grep { ! $seen{$_}++ } @a;
},
});
__END__
grep: 1 wallclock secs ( 1.04 usr + 0.00 sys = 1.04 CPU) @ 614.42/s (n=639)

shift: 1 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 296.12/s (n=305)
[/quote]
In der Routine fuer "shift" deklarierst du @array immer wieder neu,
bei "grep" nicht.

Nun, ein wenig unfair, findest du nicht? :)\n\n

<!--EDIT|opi|1168281699-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
ptk
 2007-01-09 00:02
#72850 #72850
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Nicht unfair, weil die grep-Variante gar kein @array braucht. Beide Varianten brauchen @a, und dieses wird nicht initialisiert (das meintest du, nicht "deklariert").
bloonix
 2007-01-09 09:30
#72851 #72851
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ptk,08.01.2007, 23:02]Nicht unfair, weil die grep-Variante gar kein @array braucht.[/quote]
Um die beiden Codestücke richtig zu testen, ist die Initialisierung des
Arrays auch in der Grep-Variante notwendig, denn auch die Grep Variante
benötigt das Array für die Verarbeitung. Nur weil in der Shift-Variante der
Inhalt des Arrays geändert wird, heißt das nicht, das man die Initialisierung
getrost in der Grep-Variante weglassen kann. Das wäre falsch. Denn in
einer echten Verwendung der Grep-Variante würde sie ja auch nicht immer
wieder das gleiche Array verarbeiten, sondern ein neues zugewiesen
bekommen.

Grep-Variante
Code: (dl )
1
2
my %seen;
my @unique = grep { ! $seen{$_}++ } @array;


Shift-Variante
Code: (dl )
1
2
3
4
5
6
my (%seen, $string);
$seen{$string}++ while $string = shift @array;
for (keys %seen) {
  push @array, $_;
  delete $seen{$_};
}


Das sind die beiden Varianten, das Array ist aussen vor. Da man aber die
Shift Variante nicht Benchmarken kann, ohne das Array neu zu
initialisieren, da das Array "überschrieben" wird, muss die Initialisierung
auch zur Grep-Variante hinzugefügt werden, um ein Gleichgewicht zu
halten.\n\n

<!--EDIT|opi|1168328647-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-01-09 09:55
#72852 #72852
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kommt darauf an, wie der weitere Code ist.

Wenn im Programm später das Original-Array gebraucht wird, muss es bei der shift-Methode immer "kopiert" werden, bei der grep-Variante nicht.

Wenn es nicht mehr gebraucht wird, muss es nicht "kopiert" werden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-01-09 09:58
#72853 #72853
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Guten morgen renee,

[quote=renee,09.01.2007, 08:55]Wenn im Programm später das Original-Array gebraucht wird, muss es bei der shift-Methode immer "kopiert" werden, bei der grep-Variante nicht.[/quote]
jauh, thats right. Mein Beispiel gilt nur, wenn das Original-Array nicht mehr gebraucht wird. :)

Gruss...\n\n

<!--EDIT|opi|1168329599-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-01-01 23:46.