Besoin d'aide pour trier des lignes dans un fichier
Résolu/Fermé
joeoj
-
15 déc. 2012 à 19:03
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 20 déc. 2012 à 16:53
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 20 déc. 2012 à 16:53
A voir également:
- Besoin d'aide pour trier des lignes dans un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Excel trier par ordre alphabétique en gardant les lignes - Guide
- Ouvrir un fichier .bin - Guide
7 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
15 déc. 2012 à 19:11
15 déc. 2012 à 19:11
Salut,
$ cat fich # SignalP-4.0 euk predictions # name Cmax pos Ymax pos Smax pos Smean D ? Dmaxcut Networks-used IPI:IPI00000001.2 0.143 42 0.123 42 0.142 39 0.100 0.110 N 0.450 SignalP-noTM IPI:IPI00000005.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM IPI:IPI00000006.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM IPI:IPI00000012.4 0.549 30 0.424 30 0.672 5 0.463 0.439 N 0.500 SignalP-TM IPI:IPI00000013.1 0.658 18 0.768 18 0.931 15 0.891 0.834 Y 0.450 SignalP-noTM IPI:IPI00000015.2 0.112 47 0.103 59 0.113 13 0.095 0.099 N 0.450 SignalP-noTM IPI:IPI00000017.1 0.112 22 0.120 4 0.140 34 0.125 0.123 N 0.450 SignalP-noTM IPI:IPI00000020.1 0.113 23 0.135 12 0.209 4 0.163 0.150 N 0.450 SignalP-noTM IPI:IPI00000021.5 0.113 23 0.183 10 0.359 2 0.300 0.246 N 0.450 SignalP-noTM IPI:IPI00000023.4 0.389 41 0.532 41 0.903 38 0.534 0.533 Y 0.450 SignalP-noTM $ awk '/^IPI/ && $10 ~ /Y/ { print $0 }' fich IPI:IPI00000013.1 0.658 18 0.768 18 0.931 15 0.891 0.834 Y 0.450 SignalP-noTM IPI:IPI00000023.4 0.389 41 0.532 41 0.903 38 0.534 0.533 Y 0.450 SignalP-noTM $
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 16/12/2012 à 17:23
Modifié par heyquem le 16/12/2012 à 17:23
Bonjour joeoj,
Quand je lis que tu t'es lancé dans Perl parce que tu vas avoir à l'utiliser régulièrement, ça me fait frémir.
Est-ce que tu t'es renseigné sur Perl avant de te lancer dans son apprentissage ? C'est un langage en perte de vitesse, il n'attire plus comme avant, pour deux raisons essentielles: il a des défauts (pas orienté objet de façon native, difficile à apprendre, illisible, hermétique) et Python qui est un langage de script comme lui l'a remplacé comme langage choisi par ceux qui veulent atteindre rapidement la capacité d'écrire de bon programmes dans un langage puissant.
Je te conseille fortement de t'intéresser un minimum à Python, c'est un langage dans lequel tu auras beaucoup plus et plus rapidement de productivité, avec un apprentissage de départ beaucoup plus aisé. Pour quelqu'un qui veut obtenir rapidement des résultats sans se casser les dents sur des complications inutiles, Python est parfait. C'est valable par rapport à Perl aussi bien que par rapport à Java et C++
Quand je lis que tu t'es lancé dans Perl parce que tu vas avoir à l'utiliser régulièrement, ça me fait frémir.
Est-ce que tu t'es renseigné sur Perl avant de te lancer dans son apprentissage ? C'est un langage en perte de vitesse, il n'attire plus comme avant, pour deux raisons essentielles: il a des défauts (pas orienté objet de façon native, difficile à apprendre, illisible, hermétique) et Python qui est un langage de script comme lui l'a remplacé comme langage choisi par ceux qui veulent atteindre rapidement la capacité d'écrire de bon programmes dans un langage puissant.
Je te conseille fortement de t'intéresser un minimum à Python, c'est un langage dans lequel tu auras beaucoup plus et plus rapidement de productivité, avec un apprentissage de départ beaucoup plus aisé. Pour quelqu'un qui veut obtenir rapidement des résultats sans se casser les dents sur des complications inutiles, Python est parfait. C'est valable par rapport à Perl aussi bien que par rapport à Java et C++
salut heyquem,
Pour répondre à ta première question, je ne suis pas renseigné plus que ça sur le perl avant de me lancer. A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité :)
Cependant par rapport à mon sujet : l'étude de variation de l'ensemble des protéines suite à différents stress, je génère des quantités gigantesques de donnée. Chaque analyse génère des rapport d'abondance avant et après stress pour plus de 20 à 30000 protéines, sans compter le fait qu'on effectue au moins chacune des analyses en triplicats.
Pour intégrer et tirer du sens dans tout ça, j'utilise massivement les statistiques. Mais une fois les candidats protéiques sélectionnés il faut encore que j'étudie les séquences, et ce, souvent à l'aide d'algo déjà écrit en perl. En fait je crois que dans la bio ce langage reste encore très utilisé pour tout ce qui touche à l'analyse de séquence.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage.
Mais bon si tu me dit que le python est plus simple et plus facile d'accès je vais peut être m'y pencher un peu pour voir si il me permettra d'arriver à ce que je veux !
Mer ci pour tes conseils ;)
Pour répondre à ta première question, je ne suis pas renseigné plus que ça sur le perl avant de me lancer. A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité :)
Cependant par rapport à mon sujet : l'étude de variation de l'ensemble des protéines suite à différents stress, je génère des quantités gigantesques de donnée. Chaque analyse génère des rapport d'abondance avant et après stress pour plus de 20 à 30000 protéines, sans compter le fait qu'on effectue au moins chacune des analyses en triplicats.
Pour intégrer et tirer du sens dans tout ça, j'utilise massivement les statistiques. Mais une fois les candidats protéiques sélectionnés il faut encore que j'étudie les séquences, et ce, souvent à l'aide d'algo déjà écrit en perl. En fait je crois que dans la bio ce langage reste encore très utilisé pour tout ce qui touche à l'analyse de séquence.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage.
Mais bon si tu me dit que le python est plus simple et plus facile d'accès je vais peut être m'y pencher un peu pour voir si il me permettra d'arriver à ce que je veux !
Mer ci pour tes conseils ;)
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 16/12/2012 à 19:20
Modifié par heyquem le 16/12/2012 à 19:20
"En fait je crois que dans la bio ce langage reste encore très utilisé pour tout ce qui touche à l'analyse de séquence.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage."
Bien sûr, il y a une inertie dans tout. Ils t'ont conseillé Perl parce qu'ils pratiquent Perl, ça paraît tellement couler de source pour eux. Perl ayant été très utilisé à une époque et avec des qualités indéniables pour le genre de traitement que tu décris, il y a beaucoup de gens qui l'ont pratiqué et beaucoup parmi ceux-ci qui continuent à l'utiliser. Mais ça ne veut pas dire que Perl va rester le meilleur langage pour fair de la bio-informatique jusqu'à la fin des temps (et Python non plus d'ailleurs pour essayer d'être objectif). Seulement, ce serait bien que les vieux barbons avec de l'expérience cherchent aussi à comparer leurs outils anciens aux évolutions qui ont eu lieu depuis leurs apprentissages de leurs outils.
Je ne me fais aucun souci pour la capacité de Python à obtenir les mêmes résultats qu'avec Perl, non seulement de par ses qualités propres, mais aussi parce qu'il y a une quantité effarantes d'extensions dans tous les domaines et qu'il y en a évidemment pour faire de la bio-informatique. Tu peux en avoir une idée ici:
https://pypi.org/
L'un des atouts de Python est de pouvoir facilement utiliser des programmes dans d'autres langages. Ainsi est-il possible d'utiliser la bibliothèques du langage R qui possède beaucoup de programmes spécialisés en statistique, d'après ce que j'ai lu,car moi même je n'ai encore jamais pratiqué ce genre de recours à d'autres langages.
Encore un avantage: Python peut être utilisé comme liant entre systèmes hétérogènes. Par exemple, il permet de faire du contrôle d'appareils de façon très satisfaisante. C'est ce que j'ai lu d'un scientifique dans un numéro de GNU Linux Mag il y a 4 ou 5 ans.
Enfin bref, Python on peut en parler des heures. Mais le mieux à mon avis, c'est de le tester, et en parallèle avec un autre langage c'est à mon avis encore mieux, on voit tout de suite la différence.
Je peux te donner quelques tuyaux de départ si tu veux, bien que je n'ai pas trop de temps. Mais il y a des forums consacrés à Python qui t'apporteraient toutes les réponses voulues mieux qu'ici. Bon, tu vois.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage."
Bien sûr, il y a une inertie dans tout. Ils t'ont conseillé Perl parce qu'ils pratiquent Perl, ça paraît tellement couler de source pour eux. Perl ayant été très utilisé à une époque et avec des qualités indéniables pour le genre de traitement que tu décris, il y a beaucoup de gens qui l'ont pratiqué et beaucoup parmi ceux-ci qui continuent à l'utiliser. Mais ça ne veut pas dire que Perl va rester le meilleur langage pour fair de la bio-informatique jusqu'à la fin des temps (et Python non plus d'ailleurs pour essayer d'être objectif). Seulement, ce serait bien que les vieux barbons avec de l'expérience cherchent aussi à comparer leurs outils anciens aux évolutions qui ont eu lieu depuis leurs apprentissages de leurs outils.
Je ne me fais aucun souci pour la capacité de Python à obtenir les mêmes résultats qu'avec Perl, non seulement de par ses qualités propres, mais aussi parce qu'il y a une quantité effarantes d'extensions dans tous les domaines et qu'il y en a évidemment pour faire de la bio-informatique. Tu peux en avoir une idée ici:
https://pypi.org/
L'un des atouts de Python est de pouvoir facilement utiliser des programmes dans d'autres langages. Ainsi est-il possible d'utiliser la bibliothèques du langage R qui possède beaucoup de programmes spécialisés en statistique, d'après ce que j'ai lu,car moi même je n'ai encore jamais pratiqué ce genre de recours à d'autres langages.
Encore un avantage: Python peut être utilisé comme liant entre systèmes hétérogènes. Par exemple, il permet de faire du contrôle d'appareils de façon très satisfaisante. C'est ce que j'ai lu d'un scientifique dans un numéro de GNU Linux Mag il y a 4 ou 5 ans.
Enfin bref, Python on peut en parler des heures. Mais le mieux à mon avis, c'est de le tester, et en parallèle avec un autre langage c'est à mon avis encore mieux, on voit tout de suite la différence.
Je peux te donner quelques tuyaux de départ si tu veux, bien que je n'ai pas trop de temps. Mais il y a des forums consacrés à Python qui t'apporteraient toutes les réponses voulues mieux qu'ici. Bon, tu vois.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hé hé effectivement il y a une grosse inertie dans les labo, et c'est valable pour tous les domaines malheureusement.
Je viens de passer un peu de temps à regarder un peu ce que propose le python et effectivement c'est un peu le jour et la nuit comparé au perl en terme de lisibilité. Je suis tombé sur un petit cour d'intro plutôt bien fait :http://python.developpez.com/cours/TutoSwinnen/?page=Chapitre4
Donc je crois que je vais m'y pencher un peu pour voir ce que je peux en faire, mais il a effectivement l'air prometteur et surtout beaucoup plus accessible !
En tout cas merci pour ton conseil et je suis preneur si tu as d'autre tuto intéressant !
Je viens de passer un peu de temps à regarder un peu ce que propose le python et effectivement c'est un peu le jour et la nuit comparé au perl en terme de lisibilité. Je suis tombé sur un petit cour d'intro plutôt bien fait :http://python.developpez.com/cours/TutoSwinnen/?page=Chapitre4
Donc je crois que je vais m'y pencher un peu pour voir ce que je peux en faire, mais il a effectivement l'air prometteur et surtout beaucoup plus accessible !
En tout cas merci pour ton conseil et je suis preneur si tu as d'autre tuto intéressant !
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 16/12/2012 à 19:00
Modifié par heyquem le 16/12/2012 à 19:00
Tiens , d'ailleurs, je viens d'écrire en Python le programme pour faire ce que tu as décrit dans ta question, juste après avoir posté mon précédent message:
EDIT
Le code ci-dessus marchera pour n'importe quel fichier d'entrée, même s'il fait 35 GB
Si le fichier d'entrée n'est pas gigantesque, et qu'il peut être lu en entier, c'est à dire que son contenu peut être accueilli dans la RAM (par l'instruction f.read() ci dessous), le programme suivant fera le même travail, en lançant l'expression régulière regx sur tout le contenu du fichier d'un coup, pas ligne par ligne comme dans le précédent:
.
import re regx = re.compile(' Y [\d.]+ Signal') with open('bio.txt','r') as f: generY = (line for line in f if regx.search(line)) with open('sortie.txt','w') as g: g.writelines(generY)
EDIT
Le code ci-dessus marchera pour n'importe quel fichier d'entrée, même s'il fait 35 GB
Si le fichier d'entrée n'est pas gigantesque, et qu'il peut être lu en entier, c'est à dire que son contenu peut être accueilli dans la RAM (par l'instruction f.read() ci dessous), le programme suivant fera le même travail, en lançant l'expression régulière regx sur tout le contenu du fichier d'un coup, pas ligne par ligne comme dans le précédent:
import re regx = re.compile('^.+? Y [\d.]+ Signal.+\r?\n?',re.MULTILINE) with open('bio.txt','r') as f: lu = f.read() with open('sortie.txt','w') as g: g.writelines(regx.findall(lu))
.
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 19/12/2012 à 14:44
Modifié par [Dal] le 19/12/2012 à 14:44
Dénigrer un langage tel que Perl est d'assez mauvais goût.
N'est pas plus illisible que ton code.
De plus, sur les données présentées, Perl s'exécute 5 fois plus vite, en rajoutant le contrôle d'erreurs et la fermeture des fichiers (c'est en option en Python ?) :
Avec Perl 5.10.1, Python 2.6.6, sur une Debian i486-linux.
... je te laisse imaginer le résultat avec 35 GB de données.
Dal
open(F, "bio.txt"); open(G, ">sortie.txt"); while (<F>) { if (/^.+? Y [\d.]+ Signal.+\r?\n?/) { print G; } }
N'est pas plus illisible que ton code.
De plus, sur les données présentées, Perl s'exécute 5 fois plus vite, en rajoutant le contrôle d'erreurs et la fermeture des fichiers (c'est en option en Python ?) :
$ cat tri.pl #!/usr/bin/perl open(F, "bio.txt") or die $!; open(G, ">sortie.txt") or die $!; while (<F>) { if (/^.+? Y [\d.]+ Signal.+\r?\n?/) { print G; } } close(F); close(G); $ cat tri1.py #!/usr/bin/python import re regx = re.compile(' Y [\d.]+ Signal') with open('bio.txt','r') as f: generY = (line for line in f if regx.search(line)) with open('sortie.txt','w') as g: g.writelines(generY) $ cat tri2.py #!/usr/bin/python import re regx = re.compile('^.+? Y [\d.]+ Signal.+\r?\n?',re.MULTILINE) with open('bio.txt','r') as f: lu = f.read() with open('sortie.txt','w') as g: g.writelines(regx.findall(lu)) $ time ./tri.pl real 0m0.002s user 0m0.004s sys 0m0.000s $ time ./tri1.py real 0m0.012s user 0m0.012s sys 0m0.000s $ time ./tri2.py real 0m0.011s user 0m0.008s sys 0m0.004s $
Avec Perl 5.10.1, Python 2.6.6, sur une Debian i486-linux.
... je te laisse imaginer le résultat avec 35 GB de données.
Dal
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
19 déc. 2012 à 22:14
19 déc. 2012 à 22:14
Salut Dal
Sur mon ordinateur, le code suivant correpsondant à tri1 tourne en 0.0018 secondes:
Le code similaire correspondant à tri2 tourne en 0.0024 secondes
try...except est pour avoir l'équivalent de die en Perl
Le statement with ferme les fichiers de façon propre, y compris quand il y a des erreurs qui surviennent
Mais ces temps ne veulent rien dire parce que mon processeur est un Celeron 2.7 GHz tandis que les vieux processeur i486 ont eu une fréquence max de 100 MHz d'après ce que je vois sur l'article "Intel 80486" en anglais de Wikipedia
Je vais essayer d'installer Perl sur mon ordinateur pour faire tourner ton code.
Mais pourrais tu donner le vrai code complet, je ne vois pas dans ton code les instructions qui permettent de sortir les temps
Que sont les temps real, user, sys, au passage stp ?
Sur mon ordinateur, le code suivant correpsondant à tri1 tourne en 0.0018 secondes:
import re from time import clock from os import remove te = clock() try: regx = re.compile(' Y [\d.]+ Signal') with open('bio.txt','r') as f: generY = (line for line in f if regx.search(line)) with open('sortie.txt','w') as g: g.writelines(generY) except: pass print clock()-te raw_input("pause")
Le code similaire correspondant à tri2 tourne en 0.0024 secondes
try...except est pour avoir l'équivalent de die en Perl
Le statement with ferme les fichiers de façon propre, y compris quand il y a des erreurs qui surviennent
Mais ces temps ne veulent rien dire parce que mon processeur est un Celeron 2.7 GHz tandis que les vieux processeur i486 ont eu une fréquence max de 100 MHz d'après ce que je vois sur l'article "Intel 80486" en anglais de Wikipedia
Je vais essayer d'installer Perl sur mon ordinateur pour faire tourner ton code.
Mais pourrais tu donner le vrai code complet, je ne vois pas dans ton code les instructions qui permettent de sortir les temps
Que sont les temps real, user, sys, au passage stp ?
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
20 déc. 2012 à 14:37
20 déc. 2012 à 14:37
Salut heyquem,
Les mesures sont faites au moyen de la commande "time", qui est une commande POSIX (présente sur les systèmes de type Unix) dont le fonctionnement est décrit à la page de manuel :
https://linux.die.net/man/1/time
Le code complet de mon script Perl est donné (à la suite de cat tri.pl, "cat" étant une autre commande standard permettant l'affichage du contenu d'un fichier texte).
Le même référentiel de mesure est donc utilisé pour mon script et tes deux précédents scripts.
Ma machine n'est pas un 486. Debian i486-linux se réfère au système d'exploitation Linux Debian avec un noyau compilé pour des processeurs compatibles avec i486. C'est une machine que j'ai assemblée il y a environ un an, avec un processeur Intel bon marché et 2 Go de mémoire (je ne sais pas te dire quel processeur, ni sa fréquence).
Cela dit, ce qui compte, me semble-t-il, c'est que la mesure est faite par le même procédé.
S'agissant de "l'illisibilité", c'est une affaire de style de programmation et de subjectivité, mais, pour moi, mon code n'est pas plus "illisible" que ton code.
Dal
Les mesures sont faites au moyen de la commande "time", qui est une commande POSIX (présente sur les systèmes de type Unix) dont le fonctionnement est décrit à la page de manuel :
https://linux.die.net/man/1/time
Le code complet de mon script Perl est donné (à la suite de cat tri.pl, "cat" étant une autre commande standard permettant l'affichage du contenu d'un fichier texte).
Le même référentiel de mesure est donc utilisé pour mon script et tes deux précédents scripts.
Ma machine n'est pas un 486. Debian i486-linux se réfère au système d'exploitation Linux Debian avec un noyau compilé pour des processeurs compatibles avec i486. C'est une machine que j'ai assemblée il y a environ un an, avec un processeur Intel bon marché et 2 Go de mémoire (je ne sais pas te dire quel processeur, ni sa fréquence).
Cela dit, ce qui compte, me semble-t-il, c'est que la mesure est faite par le même procédé.
S'agissant de "l'illisibilité", c'est une affaire de style de programmation et de subjectivité, mais, pour moi, mon code n'est pas plus "illisible" que ton code.
Dal
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
20 déc. 2012 à 16:07
20 déc. 2012 à 16:07
J'ai installé Perl sur mon ordinateur et après pas mal de difficultés j'ai réussi à faire tourner le code suivant:
code TRI
J'ai aussi fait tourner les codes Python suivants
code TRI1
code TRI3
Pour chaque code, je l'ai exécuté plusieurs fois et j'ai pris le temps minimal car d'une fois sur l'autre il y a des temps d'exécution variables. La répartition des temps d'exécution d'un code donné doit être du genre courbe de Gauss. Or j'ai lu quelque part que pour apprécier la vitesse d'un programme, c'est le temps minimal jusqu'où il peut descendre qui est vraiment significatif.
AInsi ai-je obtenu:
Perl TRI 0.001373 secondes
Python TRI1 0.001695 secondes (vu deux fois)
Python TRI3 0,001968 secondes
Cependant les valeurs 0.001755 et deux fois 0.001695 que j'ai vues pour TRI1 me semblent bizarres car toutes les autres valeurs étaient au dessus de 0.001826 et en fait le temps de TRI1 avait du mal à être en dessous de 0.001950.
Aussi je prends 0.001950 pour temps mini de TRI1
Quant au code Perl, il est certes descendu à 0.001373 et 0.001410 mais il avait du mal à être au dessous de 0.001450.
Donc là aussi, par méfiance sur les résultats qui me paraissent trop en dessous de la moyenne (bien que ce soit normal d'observer de telles valeurs si c'est une courbe de Gauss), je prends 0.001450 secondes comme temps mini du code Perl TRI
La comparaison des codes est donc plutôt sur:
TRI 0.001450 secondes
TRI1 0.001950 secondes
Ce qui donne le code Python tournant en 35% de temps en plus que le code Perl, soit un rapport TRI1/TRI = 1.35
Ce n'est quand même pas le rapport 3 si on prend les temps 'user', ou 6 si on prend les temps 'real' que donnent tes résultats.
Perl est donc plus rapide sur ce coup là.
Mais il faut noter que le volume de données est très faible et que les temps passés en opérations d'ouverture, véruification, fermeture de fichiers est proportionnellement important dans ce cas par rapport au traitement des données proprement dit.
Je testerai plus tard ce qui se passe avec des fichier plus gros.
D'autre part, bien sûr c'est le reproche qu'on fait à Python, d'être plus lent que d'autres langages. Certes il est plus lent à l'exécution que Perl, C, C++. Encore faudrait il examiner très sérieusement quelle est l'importance de cette lenteur pour vraiment savoir de quoi on parle. Je n'ai jamais vu beaucoup de comparatifs sur des programmes importants, il y a des rengaines qui se répètent sans que les choses soient vraiment vérifiées.
Mais c'est quasiment le seul reproche qu'on peut faire à Python. Je ne me souviens pas avoir vu d'autres reproches sur Python exprimés de façon aussi aigue que ceux d'autres langages, par exemple l'illisibilité de Perl, la complexité de C++, l'obésité de Java, le laxisme de PHP etc....
Ce qu'il faut mettre en balance c'est l'inconvénient de l'exécution (à peine) plus lente de Python par rapport aux inconvénients des autres langages.
Est-ce qu'il vaut mieux passer 10 fois plus de temps en développement et beaucoup de difficultés à relire et maintenir des codes en C++ ou Perl, pour avoir la satisfaction de gagner 2 secondes à tout casser pour certaines appliactions alors même que la rapidité d'exécution n'est pas un critère déterminant ? C'est à chacun de décider ce qui lui pèse le moins.
Personnellement, modifier un fichier en 1,45 millisecondes plutôt qu'en 1,95 millisecondes, je pense qu'on s'en fout complétement, parce qu'après ça on va passer 25 minutes devant la machine à café.
Et pour ce qui est de 35 GB de données, je demande à voir la différence de temps.
code TRI
use strict; use warnings; use Time::HiRes qw(gettimeofday tv_interval); my $t0_t1; my $t1; my $t0 = gettimeofday(); open(F, "bio.txt") or die $!; open(G, ">sortie.txt") or die $!; while (<F>) { if (/^.+? Y [\d.]+ Signal.+\r?\n?/) { print G; } } close(F); close(G); $t1 = gettimeofday(); print "t0 = $t0\n"; print "t1 = $t1\n"; $t0_t1 = $t1-$t0;; print "Execution time: $t0_t1 \n";
J'ai aussi fait tourner les codes Python suivants
code TRI1
import re from time import clock from os import remove from os.path import isfile if isfile('sortie.txt'): remove('sortie.txt') te = clock() try: regx = re.compile(' Y [\d.]+ Signal') with open('bio.txt','r') as f: generY = (line for line in f if regx.search(line)) with open('sortie.txt','w') as g: g.writelines(generY) except: pass print clock()-te raw_input("pause")
code TRI3
import re from time import clock from os import remove from os.path import isfile if isfile('sortie.txt'): remove('sortie.txt') te = clock() try: regx = re.compile(' Y [\d.]+ Signal') with open('bio.txt','r') as f,open('sortie.txt','w') as g: g.writelines(line for line in f if regx.search(line)) except: pass print clock()-te raw_input("pause")
Pour chaque code, je l'ai exécuté plusieurs fois et j'ai pris le temps minimal car d'une fois sur l'autre il y a des temps d'exécution variables. La répartition des temps d'exécution d'un code donné doit être du genre courbe de Gauss. Or j'ai lu quelque part que pour apprécier la vitesse d'un programme, c'est le temps minimal jusqu'où il peut descendre qui est vraiment significatif.
AInsi ai-je obtenu:
Perl TRI 0.001373 secondes
Python TRI1 0.001695 secondes (vu deux fois)
Python TRI3 0,001968 secondes
Cependant les valeurs 0.001755 et deux fois 0.001695 que j'ai vues pour TRI1 me semblent bizarres car toutes les autres valeurs étaient au dessus de 0.001826 et en fait le temps de TRI1 avait du mal à être en dessous de 0.001950.
Aussi je prends 0.001950 pour temps mini de TRI1
Quant au code Perl, il est certes descendu à 0.001373 et 0.001410 mais il avait du mal à être au dessous de 0.001450.
Donc là aussi, par méfiance sur les résultats qui me paraissent trop en dessous de la moyenne (bien que ce soit normal d'observer de telles valeurs si c'est une courbe de Gauss), je prends 0.001450 secondes comme temps mini du code Perl TRI
La comparaison des codes est donc plutôt sur:
TRI 0.001450 secondes
TRI1 0.001950 secondes
Ce qui donne le code Python tournant en 35% de temps en plus que le code Perl, soit un rapport TRI1/TRI = 1.35
Ce n'est quand même pas le rapport 3 si on prend les temps 'user', ou 6 si on prend les temps 'real' que donnent tes résultats.
Perl est donc plus rapide sur ce coup là.
Mais il faut noter que le volume de données est très faible et que les temps passés en opérations d'ouverture, véruification, fermeture de fichiers est proportionnellement important dans ce cas par rapport au traitement des données proprement dit.
Je testerai plus tard ce qui se passe avec des fichier plus gros.
D'autre part, bien sûr c'est le reproche qu'on fait à Python, d'être plus lent que d'autres langages. Certes il est plus lent à l'exécution que Perl, C, C++. Encore faudrait il examiner très sérieusement quelle est l'importance de cette lenteur pour vraiment savoir de quoi on parle. Je n'ai jamais vu beaucoup de comparatifs sur des programmes importants, il y a des rengaines qui se répètent sans que les choses soient vraiment vérifiées.
Mais c'est quasiment le seul reproche qu'on peut faire à Python. Je ne me souviens pas avoir vu d'autres reproches sur Python exprimés de façon aussi aigue que ceux d'autres langages, par exemple l'illisibilité de Perl, la complexité de C++, l'obésité de Java, le laxisme de PHP etc....
Ce qu'il faut mettre en balance c'est l'inconvénient de l'exécution (à peine) plus lente de Python par rapport aux inconvénients des autres langages.
Est-ce qu'il vaut mieux passer 10 fois plus de temps en développement et beaucoup de difficultés à relire et maintenir des codes en C++ ou Perl, pour avoir la satisfaction de gagner 2 secondes à tout casser pour certaines appliactions alors même que la rapidité d'exécution n'est pas un critère déterminant ? C'est à chacun de décider ce qui lui pèse le moins.
Personnellement, modifier un fichier en 1,45 millisecondes plutôt qu'en 1,95 millisecondes, je pense qu'on s'en fout complétement, parce qu'après ça on va passer 25 minutes devant la machine à café.
Et pour ce qui est de 35 GB de données, je demande à voir la différence de temps.
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 20/12/2012 à 16:56
Modifié par [Dal] le 20/12/2012 à 16:56
"il y a des rengaines qui se répètent sans que les choses soient vraiment vérifiées"
oui, c'est certain :-)
Dal
oui, c'est certain :-)
Dal
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 16/12/2012 à 19:18
Modifié par heyquem le 16/12/2012 à 19:18
A vrai dire , je n'ai jamais lu de tuto, et je n'aime pas tellement le Swinnen, il est trop lent à exposer les choses, et pas très bien à mon avis. Quelqu'un qui a un cerveau qu marche bien, il pige vite les choses, un tuto comme Swinnen fait durer durer, à mon avis. Enfin bon, chacun voit.
Je m'instruis sur Python en lisant attentivement la doc, qui est pas mal faite, bien qu'à la longue on s'aperçoit de quelques insuffisances, et en lisant de bons forums Python. Je te conseille le forum Python de developpez.com , en français, , et si tu veux lire du très haut niveau, il y a stackoverflow. Suis désolé de dire ça par rapport à ce site CCM, mais les intervenants Python ici ne sont pas légion, et comment dire , loin du niveau de stackoverflow. Pourtant c'est CCM qui m'a aidé à choisir Python parce qu'il ont des présentations de sujets bien faites, je trouve, et celle sur la prog m'a bien aidé à choisir.
Encore une chose:
"A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité"
Je crois que c'est justement pour des cas comme ça que Python est une bénédiction. Car en même temps, comment se passer de piger un minimum la prog dans un domaine comme la biologie moléculaire ou la génétique ? Hein, je vous le demande, Mme Michu.
edit
Tiens je viens de tomber là-dessus, ça a l'air pas mal pour s'imprégner rapidement de la syntaxe et de possibilités hyperbasiques de Python
https://www.stavros.io/tutorials/python/
Je m'instruis sur Python en lisant attentivement la doc, qui est pas mal faite, bien qu'à la longue on s'aperçoit de quelques insuffisances, et en lisant de bons forums Python. Je te conseille le forum Python de developpez.com , en français, , et si tu veux lire du très haut niveau, il y a stackoverflow. Suis désolé de dire ça par rapport à ce site CCM, mais les intervenants Python ici ne sont pas légion, et comment dire , loin du niveau de stackoverflow. Pourtant c'est CCM qui m'a aidé à choisir Python parce qu'il ont des présentations de sujets bien faites, je trouve, et celle sur la prog m'a bien aidé à choisir.
Encore une chose:
"A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité"
Je crois que c'est justement pour des cas comme ça que Python est une bénédiction. Car en même temps, comment se passer de piger un minimum la prog dans un domaine comme la biologie moléculaire ou la génétique ? Hein, je vous le demande, Mme Michu.
edit
Tiens je viens de tomber là-dessus, ça a l'air pas mal pour s'imprégner rapidement de la syntaxe et de possibilités hyperbasiques de Python
https://www.stavros.io/tutorials/python/
15 déc. 2012 à 19:12
16 déc. 2012 à 16:29
Pas de soucis, j'avais pas pensé qu'on pouvais le faire en bash, mais ca à l'air un peu plus simple et surtout ça marche, j'ai réussi à obtenir mon fichier, en modifiant un peu ta commande:
$ awk '/^KI/ && / Y / { print $0}' sortie_signalP>sortie.txt
Sur mon fichier à traiter les nom de protéines commençaient par KI au lieu de IPI et j'ai un peu galéré pour reussir à trouver comment imprimer dans un fichier plutôt que dans la console mais j'ai bien obtenu ce que je voulais !
Par contre je n'ai pas bien compris ce que représentait $0 après le print ?
Bonne journée
Jo
17 déc. 2012 à 10:08
$0 représente la ligne en cours, mais c'est facultatif, un print tout court aura le même effet.
17 déc. 2012 à 12:35
ah ? et alors à quoi sert de mettre ces caractères non indispensables?
soit dit en passant, tu connais bien Perl ? quel(s) langage(s) utilises-tu ?
17 déc. 2012 à 13:11
A faire joli ;-))
Non, en fait je ne connais que très sommairement awk et ne maîtrise pas toutes ses subtilités. Peut être aussi que sur certaines versions ce paramètre est indispensable, donc dans le doute, ça ne mange pas de pain.
soit dit en passant, tu connais bien Perl ? quel(s) langage(s) utilises-tu ?
Non, pas du tout. Et pour le langage, je n'en maîtrise et connais aucun, juste de bonnes bases en shell bash.