exercice python

Page principale

Répondre à ce message
Auteur: jeanluc
Date:  
À: guilde
Sujet: exercice python
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