Bonjour,
L'exercice proposé dans l'autre fil de discussion s'adresse
aux debutants python.
En prenant un fichier en entrée, il faut concatener deux lignes
pour n'en former plus qu'une et sortir le resultat dans un fichier.
Le fichier d'entrée : in.txt est généré comme suit:
bash# man perlfunc | col -b > perlfunc.man.txt
bash# for i in $(seq 1 500); do cat perlfunc.man.txt >>in.txt; done
bash# wc -l in.txt
3297081 in.txt
Voici les tests sur les codes qui sont affichés à la fin du mail :
prompt> time perl perl_v1.pl
real 0m12.714s
user 0m3.190s
sys 0m1.250s
prompt> time perl perl_v2.pl
real 0m11.803s
user 0m6.200s
sys 0m2.020s
prompt> time python python.py
real 0m18.251s ( et 0m20.365s en utilisant vraiment la fonction chop() qui est
user 0m12.750s en fait commentée dans le code python affiché en bas )
sys 0m2.410s
Les codes ne sont probablement pas optimisés, mais
voici ce que j'ai utilisé :
prompt> cat perl_v1.pl
#!/usr/bin/perl -w
use strict;
open(FILEOUT,">out.txt" );
open(FILEIN,"in.txt" );
my $lineNum=-1;
my $line;
while(<FILEIN>) {
chomp;
$line .= $_;
$lineNum++;
if( $lineNum & 1 ) {
print FILEOUT $line. "\n";
$line = "";
};
};
if( ($lineNum & 1) == 0 )
{
# cas de la derniere ligne dans le cas impair
print FILEOUT $line . "\n";
};
close FILEIN;
close FILEOUT;
prompt> cat perl_v2.pl
#!/usr/bin/perl -w
use strict;
# man perlfunc | col -b > perlfunc.man.txt
# for i in $(seq 1 500); do cat perlfunc.man.txt >>in.txt; done
open(FILEOUT,">out.txt" );
open(FILEIN,"in.txt" );
my $lineNum=-1;
my $line;
while(<FILEIN>) {
$lineNum++;
if( $lineNum & 1 ) {
$line .= $_;
print FILEOUT $line;
} else {
$line = $_;
chop($line);
};
};
if( ($lineNum & 1) == 0 )
{
# cas de la derniere ligne dans le cas impair
print FILEOUT $line . "\n";
};
close FILEIN;
close FILEOUT;
prompt> cat python.py
def chop(l):
return l[-1]=='\n' and l[:-1] or l
fileIn = open("in.txt", "r")
fileOut = open("out.txt", "w")
nextLine=1
lineNum=-1
# marche pas : while( not line=fileIn.readline() ) :
while( 1 ) :
line=fileIn.readline()
if( not line ) : break
lineNum += 1 # "lineNum++" marche pas !! dingue !
if( lineNum & 1 ):
fileOut.write(lineChop + line)
else:
#lineChop=chop(line) # à dé-commenter pour un autre essai
lineChop=line[:-1]
# derniere ligne si nombre de lignes impair
if( not lineNum & 1 ):
fileOut.write(lineChop + "\n")
# pas de close, rien ... comme un sauvage
#EOF
--
Jean-Luc