Categories
Python

Installation propre de pyAggr3g470r avec Python 3.3.1

Le script ci-dessous permet d’installer pyAggr3g470r avec Python 3.3.1 et pip de la manière la plus propre possible. Il faudra juste penser à avoir déjà installé MongoDB sur votre distribution GNU/Linux.

# Installation of Python
wget http://www.python.org/ftp/python/3.3.1/Python-3.3.1.tar.bz2
tar -xvjf Python-3.3.1.tar.bz2
rm Python-3.3.1.tar.bz2
cd Python-3.3.1/
./configure
make
sudo make install
cd ..
sudo rm -Rf Python-3.3.1/
# Installation of Distribute and PIP
wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.36.tar.gz
tar -xzvf distribute-0.6.36.tar.gz
rm distribute-0.6.36.tar.gz
cd distribute-0.6.36/
sudo python3.3 setup.py install
cd ..
sudo rm -Rf distribute-0.6.36/
wget https://github.com/pypa/pip/archive/develop.tar.gz -O pip-develop.tar.gz
tar -xzvf pip-develop.tar.gz
rm pip-develop.tar.gz
cd pip-develop/
sudo python3.3 setup.py install
cd ..
sudo rm -Rf pip-develop/
# Core requirements for pyAggr3g470r
sudo pip-3.3 install feedparser
sudo pip-3.3 install beautifulsoup4
sudo pip-3.3 install mako
sudo pip-3.3 install pymongo
# CherryPy, Minimalist Python Web Framework
wget  https://bitbucket.org/cherrypy/cherrypy/get/3.2.4.tar.gz
tar -xzvf 3.2.4.tar.gz
rm 3.2.4.tar.gz
cd cherrypy-cherrypy-cd8acbc5f2b3/
sudo python3.3 setup.py install
cd ..
sudo rm -Rf cherrypy-cherrypy-cd8acbc5f2b3/
# Language detection
hg clone https://bitbucket.org/spirit/guess_language/
cd guess_language/
sudo python3.3 setup.py install
cd ..
sudo rm -Rf guess_language/
sudo pip-3.3 install pyenchant
# Pillow, for the generation of QR Code
sudo pip-3.3 install pillow
# Finally, download pyAggr3g470r
hg clone https://bitbucket.org/cedricbonhomme/pyaggr3g470r
cd pyaggr3g470r/source/
cp cfg/pyAggr3g470r.cfg-sample cfg/pyAggr3g470r.cfg
exit 0

Le script est tenu à jour ici. Vous verrez qu’avec Python 3.3.1 les performances sont relativement bonnes, surtout avec une base contenant beaucoup d’articles.

Categories
Programming Python

Performances de Python 3.*

Bonne nouvelle, il semble que les performances de Python 3 s’améliorent significativement. Nous sommes nombreux à avoir constaté un effondrement des performances surtout lors de l’utilisation d’itérateurs. J’avais évoqué ce problème en comparant les temps de construction d’un arbre binaire à partir de données récupérées depuis une base MongoDB (avec pymongo). Pour mémoire le chargement de 50.563 articles dans le graphe prenait environ 0,9 secondes avec Python 2.7.3 et 12,9 secondes avec Python 3.2.3. La différence est énorme.

Tableau récapitulatif (temps exprimé en secondes)
Nombre d’articles chargés
dans le graphe
50.563 50.563 50.563 50.563 52.912
Phase Python 2.7.3 Python 3.1.3 Python 3.2.3 3.3.1rc1 3.3.1rc1
Chargement des articles 0,94903397 5,785764 12,9370689 0,5322029 0,5537478
Génération de l’arbre 4,757379 4,3168029 2,733838 2,491816 3,000731
Exécution globale du script 5,950 11,461 15,958 3,225 3,771

Observez les temps en italique dans le tableau (phase Chargement des articles). Python 3.3.1 fait mieux que Python 2.7.3 alors que Python 2.7.3 était beaucoup plus rapide que Python 3.2.3. Le progrès est incontestable, je n’ai rien changé au code utilisé pour ce benchmark. Les améliorations concernant les itérateurs profitent largement à pyAggr3g470r. Si vous utilisez pyAggr3g470r, je vous recommande donc chaudement d’installer Python 3.3.

Pour la phase Génération de l’arbre, avec Python 3.3.1 nous sommes à 2,49 secondes et avec Python 2.7.3 à 4,75 secondes. C’est beaucoup mieux et les itérateurs ne sont pas utilisés à ce niveau. Voyez l’implémentation de l’arbre binaire ordonné utilisée.

Le développement de Python va dans la bonne direction. J’espère que Python 3 sera bientôt par défaut sur la majeure partie des distributions GNU/Linux.

Categories
Internet Python Web

RFC 6901: Pointeur JSON

J’ai découvert ce RFC sur le blog de Stéphane Bortzmeyer. Un RFC plutôt intéressant qui spécifie une syntaxe afin d’accéder à un élément JSON depuis l’extérieur (une URI par exemple).

Ce que je veux surtout présenter c’est l’implémentation Python de ce RFC:

Python 3.1.3 (r313:86834, Nov 28 2010, 11:28:10) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more informati
>>> import json
>>> import jsonpointer
>>> import urllib.request
>>> request_answer = urllib.request.urlopen("http://api.traintimes.im/locations.json?location=WMOR&date=2013-04-14&startTime=1200").read()
>>> doc = json.loads(request_answer.decode())
>>> jsonpointer.resolve_pointer(doc,'/services/1/destination/description')
'Buxton'
>>> jsonpointer.resolve_pointer(doc,'/services/0/destination/description')
'Manchester Piccadilly'
>>> jsonpointer.resolve_pointer(doc,'/services/2/destination/description')
'Hazel Grove'

Voilà. Un RFC tout neuf. Un beau module Python qui va avec.

Categories
Python

Itérateurs: Python 2.7 vs Python 3.2

Voulant tester les performances d’une structure de donnée basée sur un arbre binaire ordonné pour pyAggr3g470r, je m’aperçois que les opérations sur les itérateurs sont drôlement plus lentes avec Python 3.2.3 qu’avec Python 2.7.3. Je le soupçonnais déjà, mais pas à ce point.

Voici donc la petite implémentation d’arbre binaire ordonné que j’ai ajouté à pyAggr3g470r. Rien de bien spécial, niveau licence informatique je crois. Le script que voici s’occupe:

  • de charger une base MongoDB constituée de 50.563 éléments (730 Mo sur disque);
  • de créer l’arbre avec les 50.563 éléments;
  • d’exécuter quelques opérations de base sur l’arbre: récupérer le plus petit élément (ancien article), récupérer le plus grand élément (récent article) et trouver la profondeur maximum de l’arbre (chemin le plus long).

Devinez quelle partie prend le plus de temps? Attention la différence est surprenante. Voyez.

Avec Python 2.7.3:

$ time python testbinarytree.py
Loading articles from the database...
50563 articles loaded in 0.949033975601 seconds.
Generating the binary tree...
Generation done in 4.757379 seconds.
Maximum depth of the tree:
512
Oldest article:
2002-05-11 04:14 - Testing
Newest article:
2013-03-18 16:32 - Enseignement supérieur L’Uni décroche de bonnes notes

real    0m5.950s
user    0m5.592s
sys     0m0.192s

Avec Python 3.2.3:

$ time python3.2 testbinarytree.py
Loading articles from the database...
50563 articles loaded in 12.937068939208984 seconds.
Generating the binary tree...
Generation done in 2.733838 seconds.
Maximum depth of the tree:
512
Oldest article:
2002-05-11 04:14 - Testing
Newest article:
2013-03-18 16:32 - Enseignement supérieur L’Uni décroche de bonnes notes

real    0m15.958s
user    0m15.529s
sys     0m0.216s

Vous pouvez faire la même chose avec par exemple Python 3.1.3. Le tableau ci-dessous montre l’essentiel.

Tableau récapitulatif (temps exprimé en secondes)
Phase Python 2.7.3 Python 3.1.3 Python 3.2.3 Tendance
Chargement des articles 0.949033975601 5.785764 12.937068939208984
Génération de l’arbre 4.757379 4.31680297852 2.733838
Exécution globale du script 5.950 11.461 15.958

Le script s’exécute environ 3 fois plus vite avec Python 2.7.3 malgré une génération de l’arbre binaire 2 secondes plus longue qu’avec Python 3.2.3. La version 2.7.3 l’emporte de loin grâce à la phase de chargement de la base MongoDB qui utilise des itérateurs avec PyMongo. Si on enlève le chargement de la base (on pourrait par exemple sérialiser un objet) Python 3.2.3 serait environ plus rapide de 2 secondes. J’ai exécuté les tests de nombreuses fois.

Il n’y a pas photo.

Categories
Programming Python

pyAggr3g470r: détection de langue

pyaggr3g470r-languages

La détection de langue fait son retour dans pyAggr3g470r. J’avais retiré cette fonctionnalité il y a environ un an, avant le passage à Python 3. Il faut attendre environ 3 minutes pour une base de plus de 46.000 articles.

Categories
Programming Python

Writing Idiomatic Python

Je suis d’accord avec tout ce qui est dit ici. De cette manière on fait du code Pythonesque, beau, facile à relire par tout le monde et plus safe.

Categories
Programming Python

Module de manipulation d’URL de Python 3

Avez-vous remarqué que le module urllib de Python 3 a été découpé en plusieurs parties? Par la même occasion urllib2 a même disparu. C’est une très bonne chose, c’est encore plus simple comme ça. Il y a même un module pour parser les fichiers robots.txt.

Comme nous aimons OpenPhoto nous allons illustrer rapidement comment utiliser urllib pour télécharger une ressource Web et par la même occasion présenter le module json. Le script ci-dessous permet donc de télécharger toutes les photos d’une instance OpenPhoto et des les archiver (oui nous allons aussi utiliser le module tarfile 😉 ). Voyez comme tout est simple avec Python:

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import urllib.request
import json
import os
import tarfile

url = "http://photos.cedricbonhomme.org/"
print("Retrieving the list of photos...")
html = urllib.request.urlopen(url+"photos/list.json?pageSize=1000")
text = html.read()
photos = json.loads(text.decode())

tar = tarfile.open("cedric-photos.tar.gz", "w:gz")

for idx, photo in enumerate(photos["result"]):
    try:
        path  = photo["pathOriginal"]
    except:
        path = photo["pathBase"]
    print("Downloading", path, "...")
    filein = urllib.request.urlopen(path)
    name = photo["filenameOriginal"]
    image = filein.read()
    filein.close()
    fileout = open(name,'w+b')
    fileout.write(image)
    fileout.close()

    print("Archiving", name)
    tar.add(name)

    os.unlink(name)

print(str(len(photos["result"])) + " photos archived.")
tar.close()
Categories
Python

Python devient fainéant

Python 3 est un peu plus fainéant. Voyez:

>>> r = range(10)
>>> print(r)
range(0, 10)
>>> print(r[3])
3

Avec Python 2.7:

>>> r = range(10)
>>> print r
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print r[3]
3

C’est encore une petite chose à savoir à propos de Python. Cela peut sembler ridicule de prime abord, mais il peut y avoir un avantage avec un très grand range. Bon avec Python 2, on peut aussi utiliser les itérateurs pour avoir ça.

Tu trouveras d’autres «astuces» Python sympa ici.

Et tiens, au lieu de fainéanter je pourrai continuer d’apprendre Haskell. Un vrai langage de paresseux.

Categories
Python

La grande archive de nouvelles mise à jour (2)

Dorénavant 45.668 articles de mes flux sont disponibles à cette page. Avec tout de même plus de 17.000 articles pour le journal L’Essentiel, 38,2719 pour cent du total.

En Juin dernier 36.186 articles étaient déjà disponibles.

Categories
Programming Python

pyAggr3g470r version 3.7

La version 3.7 de pyAggr3g470r est publiée. Voici la liste des changements:

  • la librairie de template Mako est maintenant utilisée pour le rendue des pages;
  • quelques améliorations au niveau de la base de données;
  • certains mots (un, une, de, a, of, etc.) sont ignorés pour la génération du nuage de tags;
  • une nouvelle page indique la liste des flux inactifs;
  • petites améliorations du CSS.