Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
fichier_des_nombres_premiers [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


fichier_des_nombres_premiers

Warning: Undefined array key 4 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1453

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
fichier_des_nombres_premiers [2008/09/17 20:04]
tyrtamos créée
fichier_des_nombres_premiers [2008/09/17 20:35]
tyrtamos
Ligne 17: Ligne 17:
 Il y avait tout de même un petit problème. Je voulais utiliser l'accélérateur psyco (voir sur ce site: [[http://python.jpvweb.com/mesrecettespython/psyco]]), mais lorsque l'accélérateur est en fonctionnement, il n'écoute pas le clavier, et donc aucun "Ctle-C" ne l'arrête. Or, pour que le fichier en cours reste valable, il faut trouver un moyen pour générer une interruption à la demande de façon qu'une instruction de fermeture du fichier puisse être exécutée. Ce que, bien sûr, l'arrêt sauvage de la console ou le reboot du PC ne saurait faire. De plus, je tiens à ce que ça fonctionne en "multiplateforme" (Windows + Linux au moins, éventuellement Mac). Il y avait tout de même un petit problème. Je voulais utiliser l'accélérateur psyco (voir sur ce site: [[http://python.jpvweb.com/mesrecettespython/psyco]]), mais lorsque l'accélérateur est en fonctionnement, il n'écoute pas le clavier, et donc aucun "Ctle-C" ne l'arrête. Or, pour que le fichier en cours reste valable, il faut trouver un moyen pour générer une interruption à la demande de façon qu'une instruction de fermeture du fichier puisse être exécutée. Ce que, bien sûr, l'arrêt sauvage de la console ou le reboot du PC ne saurait faire. De plus, je tiens à ce que ça fonctionne en "multiplateforme" (Windows + Linux au moins, éventuellement Mac).
  
-Dans mes recherches, j'ai été surpris de constater que Python n'avais ni "getch()" ni kbhit(). Il a donc fallu "bricoler": +Dans mes recherches, j'ai été surpris de constater que Python n'avais ni "getch()" (saisir le caractère tapé au clavier) ni "kbhit()" (savoir si une touche a été appuyée). Il a donc fallu "bricoler": 
  
-  * des fonctions getch_win() (pour Windows) et get_lin() (pour Linux) qui sont censées renvoyer le caractère tapé au clavier. La fonction getch() elle-même pointe sur l'une ou l'autre de ces fonction selon la plateforme.+  * des fonctions getch_win() (pour Windows) et get_lin() (pour Linux) qui sont censées attendre et renvoyer le caractère tapé au clavier. La fonction getch() elle-même pointe sur l'une ou l'autre de ces fonctions selon la plateforme.
  
   * un thread clavier pour compenser l'absence de kbhit(): ce thread peut attendre qu'un utilisateur tape sur le clavier sans ralentir le calcul   * un thread clavier pour compenser l'absence de kbhit(): ce thread peut attendre qu'un utilisateur tape sur le clavier sans ralentir le calcul
Ligne 26: Ligne 26:
  
 Et... ça marche! Et... ça marche!
 +
 +Pour utiliser ce programme, il faut:
 +
 +  * se placer dans une console (cmd pour Windows, shell pour Linux), 
 +
 +  * se placer avec la commande "cd" dans le répertoire dans lequel il y a le programme (je l'ai appelé trouvepremiers.py)
 +
 +  * lancer le programme par "python trouvepremiers.py"
 +
 +Au démarrage, le programme détecte psyco et l'utilise s'il est présent.
 +
 +Il cherche ensuite s'il y a un fichier "premiers.txt" dans le même répertoire
 +
 +  * si oui, il le charge en mémoire
 +
 +  * si non, il en fabrique un nouveau.
 +
 +Ensuite, il ouvre le fichier en ajout, et y ajoute les nombres premiers au fur et à mesure qu'il les trouve.
 +
 +Un Ctle-C ou n'importe quelle autre erreur arrête le programme, mais en fermant correctement le fichier.
 +
 +Avec psyco, le calcul est très rapide compte tenu de la quantité de calcul réalisé. Sous Linux (swap=2Go), au bout de 3 ou 4 heures seulement, je suis arrivé à "2 176 005 437", avec un fichier de 1Go! 
 +
 +Sous Windows XP, j'ai été bloqué à "1 339 088 837" pour "MemoryError": il n'a pas supporté une liste aussi longue de nombres. Il est clair que même avec Linux, ce calcul échouera lorsque l'OS refusera la liste des nombres premiers en mémoire. Il faudra alors utiliser d'autres méthodes. 
 +
 +D'ici là, rien ne vous empêche de laisser tourner ce programme en tâche de fond pendant plusieurs mois...
  
 Voilà le code. Il est auto-documenté: Voilà le code. Il est auto-documenté:
fichier_des_nombres_premiers.txt · Dernière modification: 2008/09/23 04:52 de tyrtamos