Font
[thread]6203[/thread]

Anzahl Zeilen in Textdatei ermitteln: (Wie mache ich das am schnellsten?) (page 2)



<< |< 1 2 3 4 >| >> 35 entries, 4 pages
Taulmarill
 2004-04-21 14:11
#81706 #81706
User since
2004-02-19
1750 articles
BenutzerIn

user image
ahh ich hab noch ne schnellere variante gefunden
Code: (dl )
1
2
3
4
5
6
  C => sub {
open ( FILE, "<test.txt" );
while ( <FILE> ) {}
my $ln = $.;
close (FILE);
}


liefert in meinem benchmark folgenden wert

Code: (dl )
C: 19 wallclock secs (18.53 usr +  0.55 sys = 19.08 CPU) @  0.26/s (n=5)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sri
 2004-04-21 15:56
#81707 #81707
User since
2004-01-29
828 articles
BenutzerIn
[Homepage] [default_avatar]
Diese Lösung mit Globs hab ich mal irgendwo bei den PerlMonks gesehen, ist aber immernoch viel langsamer als wc -l.

Code: (dl )
perl -lpe '}{*_=*.}{' test.txt
\n\n

<!--EDIT|sri|1082548658-->
Taulmarill
 2004-04-21 16:15
#81708 #81708
User since
2004-02-19
1750 articles
BenutzerIn

user image
also, schneller als
Code: (dl )
1
2
    while ( <FILE> ) {}
my $ln = $.;

is das auch nich, aber als einzeiler sehr cool.

was genau tut *_=*.?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2004-04-21 16:33
#81709 #81709
User since
2003-08-04
5866 articles
ModeratorIn
[Homepage]
user image
[quote=jan,21.04.2004, 11:57]sonst nimm doch einfach die dateigröße und lass anschließend den fortschritt durch die anzahl der verarbeiteten bytes anzeigen, nach dem motto "eine lange zeile mit mehr daten kostet mehr zeit", das spart dir den ersten zählvorgang komplett und ist auch nicht ganz so schlimm ;)[/quote]
Auch eine interessante Idee...


Mein Code sieht so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub zeilenzahl ($) {
my $f = shift;
my $c = 0;


open (F, $f) or stirb("Kann '$f' nicht oeffnen: $!");
++$c while <F>;
close(F) or stirb($!);


return $c;

} # sub zeilenzahl
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2004-04-21 16:37
#81710 #81710
User since
2004-02-19
1750 articles
BenutzerIn

user image
also nach dem was ich gebenchmarkt habe währe folgendes etwas schneller
Code: (dl )
1
2
while (<F>) {};
$c = $.;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sri
 2004-04-21 16:37
#81711 #81711
User since
2004-01-29
828 articles
BenutzerIn
[Homepage] [default_avatar]
[quote=Taulmarill,21.04.2004, 14:15]was genau tut *_=*.?[/quote]
es sieht gut aus ;)

$_ wird ja automatisch ausgegeben, das ist also nur ne hübsche zuweisung, die nur sehr unwesendlich schneller ist als $_=$.
Crian
 2004-04-21 16:38
#81712 #81712
User since
2003-08-04
5866 articles
ModeratorIn
[Homepage]
user image
[quote=Taulmarill,21.04.2004, 14:15]also, schneller als
Code: (dl )
1
2
    while ( <FILE> ) {}
  my $ln = $.;

is das auch nich, aber als einzeiler sehr cool.

was genau tut *_=*.?[/quote]
Das will ich eigentlich gar nicht so genau wissen ... ich schätz mal alles mit _ wird alias für alles mit ., also $_ alias für $. und bei -p wird am Ende print $_ ausgegeben, also print $. ... naja denk ich jetzt mal so.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-04-21 16:41
#81713 #81713
User since
2003-08-04
5866 articles
ModeratorIn
[Homepage]
user image
[quote=Taulmarill,21.04.2004, 14:37]also nach dem was ich gebenchmarkt habe währe folgendes etwas schneller
Code: (dl )
1
2
while (<F>) {};
$c = $.;
[/quote]
Ja, das hatte ich mir schon gedacht, als ich meins schrieb, aber danke für das genaue benchmarken.

Aber 19 oder 23 Sekunden ist irgendwie beides zu lang, ich fürchte ich muss Jans Weg gehen. Das Betimmen der Dateigröße mit -s geht hoffentlich schneller.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sri
 2004-04-21 16:45
#81714 #81714
User since
2004-01-29
828 articles
BenutzerIn
[Homepage] [default_avatar]
[quote=Taulmarill,21.04.2004, 14:37]also nach dem was ich gebenchmarkt habe währe folgendes etwas schneller
Code: (dl )
1
2
while (<F>) {};
$c = $.;
[/quote]
Hier ist der Grund ;)

Code: (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
sri@odyssey:~$ perl -MO=Deparse -lpe '}{*_=*.}{' test.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
}
{
*_ = *.;
}
{
();
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK


sri@odyssey:~$ perl -MO=Deparse -pe '}{*_=*.}{' test.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
();
}
{
*_=*.;
}
{
();
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK

sri@odyssey:~$ perl -MO=Deparse -e 'while (<>) {}; print $.' test.txt
while (defined($_ = <ARGV>)) {
();
}
print $.;
-e syntax OK


Soviel zum Thema Bytecode optimierung im Perl5 compiler... :-P\n\n

<!--EDIT|sri|1082552243-->
Taulmarill
 2004-04-21 16:51
#81715 #81715
User since
2004-02-19
1750 articles
BenutzerIn

user image
ok, aber was genau ist denn jetzt ein *. im gegensatz zu $., was ja ein "normaler" scalar ist.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 3 4 >| >> 35 entries, 4 pages



View all threads created 2004-04-21 11:58.