Quantcast
Channel: AFPy's Planet
Viewing all 3409 articles
Browse latest View live

[Biologeek] Innovation et locomotion

$
0
0

Le nombre de moyens de locomotion utilisés au quotidien par des adultes est relativement restreint. En France, j'en dénombre 6 : la voiture, le train/RER/métro, l'avion, le car/bus, le vélo et la trottinette pour les plus citadins. C'est très peu finalement, on nous avait promis la révolution du Segway mais c'est resté un gadget pour la Silicon Valley. J'exclue les rollers du fait de l'amplitude nécessaire pour avancer qui rend leur utilisation délicate en milieu semi-urbain, je les avais pas mal utilisés au Japon mais le trafic et le revêtement montpelliérains ne permettent pas d'envisager cette solution.

Le fait de devoir faire quelques kilomètres pour rejoindre les locaux de scopyleft me fait réfléchir à des alternatives au vélo pour varier les plaisirs. Il existe quelques initiatives récentes qui méritent le détour :

  • SoloWheel qui parait assez bancale à première vue mais qui doit procurer des sensations assez exceptionnelles une fois la bête maîtrisée ;
  • ZBoard qui devrait ravir les skaters fainéants (et les riches californiens) ;
  • StreetStepper qui est très à la mode chez les trailers car ça fait énormément travailler les cuisses et permet de redescendre sans que ce soit traumatisant pour les articulations. En plus ils sont à Six-Four, il faudra que j'aille tester à l'occasion :-).

Si vous en connaissez d'autres qui ne nécessitent pas (trop) d'électricité je suis preneur.


[cubicweb] CubicWeb at Data Tuesday on Feb 26th 2013

[Inspyration] LibreOffice 4.0 et Python

$
0
0
LibreOffice 4.0, c'est moins de Java et plus de C++ et de Python

[Inspyration] Python est en péril : Appel à l'aide

$
0
0
La marque Python pourrait être en péril en Europe. Un appel à l'aide est lancé à toutes les entreprises utilisant Python et souhaitant aider la marque Python à ne pas se faire usurper.

[afpyro] AFPyro à Paris, vendredi 22 Février

$
0
0

Contexte

Le 11 Février marque l’entrée dans l’année du Serpent ! Fêtons ça avec un AFPyro !

Quand ?

Le Vendredi 22 Février à partir de 19h30.

Où ?

La Grosse Caisse au 160 rue Montmartre, dans le 2ème arrondissement de Paris.

[blog.afpy.org] Sprint AFPy le 30, 31 Mars

$
0
0

Nous organisons un sprint pour continuer la refonte du site de l'AFPy. Le site est construit à partir de plusieurs applications différentes, tournant sur plusieurs framework différents (principalement plone et pylons). Le but du sprint est d'achever la migration vers une version récente de plone et de refaire le design, afin de déployer le nouveau site.

Le sprint aura lieu samedi 30 Mars et dimanche 31 Mars, à Bearstech.

Emencia financera l'évènement.

Pour plus d'information, contactez nelle dot varoquaux at afpy dot org.

http://www.april.org/dtcphotos/emencia.png

[Biologeek] Consensus et contentment

$
0
0

J'ai déjà eu l'occasion de parler de consentement dans la sociocratie, je voudrais revenir sur les décisions traditionnelles par consensus. On peut lire dans la FAQ sur la sociocratie :

On peut résumer ainsi les deux concepts : le consensus, c'est tout le monde dit oui ; le consentement, c'est personne ne dit non.

Le consensus est une idée généreuse et qui semble idéale. Cependant, sa mise en œuvre pose deux problèmes majeurs. D'abord, le consensus présuppose la participation systématique de tous ; pourtant, certaines personnes peuvent à un instant donné ne pas se sentir concernées par un problème ou n'avoir aucune compétence sur le sujet. Ensuite, le consensus donne à chaque membre de l'organisation un droit de veto sur toutes les décisions puisqu'il suffit qu'une seule personne refuse son accord pour que la décision soit bloquée. Le consensus nécessite donc de la part de tous les membres de l'organisation une implication forte maintenue dans la durée et une volonté tout aussi forte d'aboutir systématiquement à un accord. Est-ce vraiment possible ?

Le consentement apporte une solution à ces deux difficultés. D'une part, le consentement permet la participation de tous, mais ne l'impose pas ; une personne non intéressée par une décision ou non qualifiée pour en discuter peut très bien ne pas participer au débat ou le suivre sans émettre d'objection. D'autre part, en sociocratie, toute objection doit être argumentée, et la personne qui objecte contribue à la recherche d'une solution à son objection ; cela empêche toute tentative de bloquer une décision pour le simple plaisir de faire de l'obstruction.

Ainsi, le consentement garde-t-il les avantages du consensus en termes de participation collective tout en étant réaliste et efficace.

À l'usage, le fait de pouvoir exprimer son désaccord tout en ne bloquant pas la décision se trouve être très intéressant en termes de satisfaction et de considération personnelle. Si la recherche de consensus à 4 semble encore envisageable, elle passe difficilement à l'échelle sans prendre un temps d'argumentation non négligeable pour arriver à une solution bien souvent frustrante pour tous.

Le consensus est mou et insatisfaisant, le consentement est responsabilisant mais libérateur. Le consentement permet un lâcher-prise éclairé et volontaire sur les décisions.

[Biologeek] Écologie et ordres de grandeur

$
0
0

— Est-ce qu'il est plus intéressant de réduire ma consommation d'essence d'un litre aux 100 km ou de prendre l'avion une fois par an ?
— Est-ce qu'il est plus intéressant de passer 5 minutes de moins sous la douche ou de réduire mon chauffage d'un degré ?
— Est-ce qu'il vaut mieux arrêter de manger de la viande ou manger local ?
— Est-ce qu'il vaut mieux acheter un nouveau vélo ou restaurer un scooter d'occasion ?
— Est-ce qu'il vaut mieux isoler mon salon ou éduquer mes proches ?
— Est-ce qu'il est plus intéressant de faire un tour de kart ou un vol d'initiation en ULM ?

Les exemples sont mauvais mais je voulais illustrer le fait que je manque d'ordres de grandeur permettant de faire les choix écologiques les plus intéressants au quotidien.

Alors bien sûr, vous allez me répondre en cœur qu'il suffit de tout faire ! Que chaque geste compte, que chaque goutte compte. J'aimerais avoir une approche différente de mon impact environnemental en l'envisageant comme une recherche de performance sur un script : trouver les leviers qui permettent de réduire énormément ma consommation avec un minimum d'effort. Et itérer.

Aujourd'hui je manque de données et de comparatifs pour entreprendre cette démarche responsable de manière motivante et d'être en capacité de quantifier le gain relatif à la perte de confort associée.


[hautefeuille] Développer pour Android en Python grâce à Kivy

$
0
0

Kivy est un framework Python permettant de développer des applications OpenGL gérant les nouveaux périphériques tactiles.

Python-For-Android est un outil développé par l’équipe de Kivy permettant de générer des paquets APK à partir d’applications Python écrites sous Kivy.

Je vous propose donc ici de mettre en place la chaîne de compilation nécessaire à la création de paquets APK Android.

La distribution utilisée ici est une Ubuntu 12.04 LTS avec Python 2.7.X.

L’API Android utilisée est la 14 et le NDK Android est le r8c.

Prérequis d’installation

Vérification de l’installation Java

Vous pouvez mettre la version de Java que vous voulez.

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Puis pour choisir la version de votre système.

sudo update-alternatives --config java

On vérifie.

java -version

Vous pouvez également exporter la variable d’environnement $JAVA_HOME dans .bashrc ou dans /etc/environment

La variable $JAVA_HOME doit pointer vers la jvm que vous utilisez.

Moi j’utilise la version suivante :

echo $JAVA_HOME
/usr/lib/jvm/java-6-openjdk-amd64

Paquets à installer

Les paquets minimaux à installer.

sudo apt-get install build-essential patch git-core ccache ant pip python-dev

Sur les distributions 64 bits les paquets suivants sont à installer.

sudo apt-get install ia32-libs and libc6-dev-i386 lib32stdc++6 lib32z1

Mettre à jour Cython

sudo pip install --upgrade cython

Installation du SDK et du NDK

On crée un répertoire de travail, on télécharge le SDK, le NDK et Python-For-Android.

mkdir android-dev
cd android-dev
wget http://dl.google.com/android/ndk/android-ndk-r8c-linux-x86.tar.bz2
wget http://dl.google.com/android/android-sdk_r21.0.1-linux.tgz
tar jxvf android-ndk-r8c-linux-x86.tar.bz2
tar xvf android-sdk_r21.0.1-linux.tgz
git clone git://github.com/kivy/python-for-android

On doit ensuite mettre à jour nos variables d’environnement dans le fichier .bashrc par exemple :

export ANDROIDSDK="/path/to/android/android-sdk-linux_86"
export ANDROIDNDK="/path/to/android/android-ndk-r8c"
export ANDROIDNDKVER=r8c
export ANDROIDAPI=14
export PATH=$ANDROIDNDK:$PATH
export PATH=$ANDROIDSDK:$PATH
export PATH=$ANDROIDSDK/tools:$PATH
export PATH=$ANDROIDSDK/platform-tools:$PATH
export JAVA_HOME="/usr/lib/jvm/java-6-openjdk-amd64"

Puis on prend en compte les modifications :

source .bashrc

Mise à jour du SDK Android

Dans le répertoire “tools” de votre SDK, lancez la commande suivante :

./android -update sdk -no-ui

La mise à jour peut-être longue en fonction des paquets téléchargés.

Utilisation des outils

Il faut utiliser à présent les outils disponibles dans le répertoire de Python-For-Android.

Construire la distribution Python avec Kivy et PIL :

./distribute.sh -m "pil kivy" -d "kivy-pil-dist"

Puis générer le paquet :

cd dist/kivy-pil-dist
./build.py --package org.test.monappli --name monappli \
--version 1.0 --dir ~/code/monappli --orientation portrait --permission INTERNET debug

Un paquet est généré dans le dossier bin.

[afpyro] AFPyro à Lyon - le 27 Février 2013

$
0
0

Un Afpyro aura lieu le mercredi 27 février à partir de 20h à l’Antre Autre - 11 rue Terme - 69001 Lyon.

Une présentation sur Salt sera donnée par Gaston Tjebbes. Salt est un outil permettant de gérer des serveurs et écrit en Python.

L’Antre Autre est un lieu où nous pouvons discuter autour d’un verre, et, pour ceux qui le souhaitent, prendre un repas.

Pour se rendre à l’Antre Autre :
  • en métro : arrêt Hôtel de Ville
  • en bus : lignes C13 et C18 arrêt Mairie du 1er ou lignes 19, C14 et C3 à l’arrêt Terreaux
  • en vélo’v : stations Place Sathonay, Carmélites Burdeau, Place de la paix

[tarek] Flake8 2.0 released

$
0
0

Flake8 is a extensible code checker. It unifies tools like PyFlakes or pep8 so you can check your Python code with a single command line call - or directly in Git & Mercurial.

Get the new version at PyPI or simply:

$ pip install flake8

The project looks like it's getting quite popular - over 113,000 downloads, according to crate.io

There are many projects out there that also bundle FLake8 in VIM, like vim-flake8, flake8-vim, Syntastic or Khuno -- wow, 4 projects.

Ian Cordasco took over the maintenance of Flake8 a few months ago and did an amazing work of cleaning the code.

The code still had a local copy of PyFlakes, I've hacked back when I started, to make it compatible with Python 3. The plan was to have the upstream project compatible with Python 3 and make Flake8 depend on it - and Ian worked hard on fixing this dependency issue - among other stuff.

In parallel, Florent Xicluna also worked on the Python 3 porting in PyFlakes and also started to help the maintenance of pep8.

The very good news is that we've all joined forces to synchronize our efforts, and we've released together a 2.0 version of Flake8 that now uses all upstream projects as dependencies and also provides a nice way to add new extensions.

Check out how to create new extensions at : http://flake8.readthedocs.org/en/latest/extensions.html

Good times, thanks Ian and Florent.

By the way : we'd like to add a logo to the project - Ian and other people on Twitter suggested a snow flake with 8 branches. If you're an artist/designer and want to contribute a logo - please contact me.

[Biologeek] Développeurs créatifs

$
0
0

À ne pas (faire) oublier : Les développeurs sont des créatifs, pas des ouvriers.

C’est vrai pour tous, sans exceptions, même pour ceux qu’on fait travailler à la chaîne dans les mauvaises sociétés de service en ingénierie informatique. Même ceux là, s’ils ne sont pas remplaçables par des robots, ce n’est pas en raison de la complexité des choix qu’ils prennent, de la multiplicité des paramètres pris en comptes, mais bien parce qu’ils inventent les solutions.

Éric D., Les développeurs sont des créatifs

J'ai écrit L'artiste qui sommeille en chaque geek il y a 5 ans et ma vision là-dessus a beaucoup évoluée. Notamment car j'ai rencontré des développeurs qui ne vont pas dans les conférences, qui ne publient rien sur le Web, qui ne participent pas à des projets Open-Source, qui ne dédient tout simplement pas une part importante de leur vie à leur métier : l'informatique.

En restant dans son microcosme d'informaticiens curieux et cultivés, on oublie qu'une proportion que j'ai découverte significative (je n'ai aucune idée de cette proportion en fait, ni de la manière de la quantifier…) n'est pas du tout dans la même approche du développement et je trouve cela sain qu'il puisse y avoir une diversité à ce niveau là. Même si j'ai mis longtemps à l'accepter.

On en arrive à l'assertion « Les développeurs intéressés par leur métier sont créatifs », mais ça n'est pas du tout restreint aux développeurs. Les personnes intéressées par leur métier sont créatives. Peut-être que leur proportion est plus élevée dans l'informatique car c'est un métier très jeune qui est (était ?) exploré par passion mais je n'en suis même pas persuadé. Il faut se méfier de la part invisible et silencieuse de l'iceberg.

[novapost] Transformer un OneToOneField en AutoField avec South

$
0
0

South, c'est cool. Mais des fois, il faut mettre les mains dedans, et ça devient vachement moins cool. Mais bon, à force, ça finit par rentrer.

Contexte

Dans notre projet, on a eu besoin de gérer des permissions sur des instances d'objet valables pour un rôle donné, un rôle étant affecté à des utilisateurs.

Pour cela, on a utilisé django-guardian, qui gère ces permissions soit pour un utilisateur, soit pour un groupe.

On a donc dû lier nos rôles à des groupes, avec un OneToOneField, pour gérer ces permissions.

Mais en plus, comme on fait du multi-site, et que les groupes django ont une contrainte d'unicité sur name, on a dû redéfinir un model Group.

Au départ, le model ressemblait à ça:

from django.db import models
from django.contrib.auth.models import Permission, Group
from django.contrib.sites.models import Site


class MyGroup(models.Model):
    name = models.CharField(max_length=80)
    site = models.ForeignKey(Site, default=Site.objects.get_current, editable=False)
    group = models.OneToOneField(Group, null=True, editable=False)

    class Meta:
        unique_together = ['name', 'site']


class Role(MyGroup):
    ...

(Je passe les methodes save et delete pour gérer le groupe associé à MyGroup, ce n'est pas ce qui m'intéresse dans ce post)

Pour simplifier, on a eu envie de faire sauter le model MyGroup, pour avoir un model de ce genre:

from django.db import models
from django.contrib.auth.models import Permission, Group
from django.contrib.sites.models import Site


class Role(models.Model):
    name = models.CharField(max_length=80)
    site = models.ForeignKey(Site, default=Site.objects.get_current, editable=False)
    group = models.OneToOneField(Group, null=True, editable=False)

    ...

    class Meta:
        unique_together = ['name', 'site']

Sortons la boîte à outils

Allez, hop, on dégaine south. Je ne vais pas m'étendre sur les manips successives (changement de model, schemamigration, datamigration, changement de code, etc) nécessaires pour tout bien migrer comme il faut, je vais passer directement à THE problem.

Pour transformer le OneToOneField implicite qui remplace la PK du model Role en AutoField, il a bien fallu que je tente un truc du genre:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_column('app_role', 'mygroup_ptr_id', 'id')
        db.alter_column('app_role', 'id', self.gf('django.db.models.fields.AutoField')(primary_key=True))

Si seulement c'était si simple :)

Ca marche parfaitement avec sqlite, mais le alter_column pète avec postgresql ! (Pas testé avec les autres backends)

On sait parfaitement créer une primary key avec south pour postgresql lorsqu'on crée une table, mais un alter column échoue:

django.db.utils.DatabaseError?: type "serial" does not exist

Une petite recherche google m'a permis de tomber sur le ticket south n° 407, qui donne une piste pour transformer un IntegerField en AutoField pour postgresql.

Dans le cas de notre migration ça donnerait:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_column('app_role', 'mygroup_ptr_id', 'id')
        # Petit cas particulier pour posgtresql
        if db.__module__ == 'south.db.postgresql_psycopg2':
            # Supression de la FK
            db.delete_foreign_key('app_role', 'id')
            # Création d'une séquence
            db.execute("CREATE SEQUENCE app_role_id_seq")
            # Avec set de la dernière valeur
            db.execute("SELECT setval('app_role_id_seq', (SELECT MAX(id) FROM app_role))")
            # Et ajout d'un default sur la nouvelle PK
            db.execute("ALTER TABLE app_role ALTER COLUMN id SET DEFAULT nextval('app_role_id_seq'::regclass)")
        else
            db.alter_column('app_role', 'id', self.gf('django.db.models.fields.AutoField')(primary_key=True))

Oui mais ça suffit pas ...

Il manque un truc, et on ne s'en rend compte que si on s'amuse à faire des loaddata.

Un loaddata prend des données sérialisées, et crée des objets avec une PK déjà définie: on n'appelle pas le default, qui fait un nextval et met à jour la dernière valeur de la séquence.

A la fin d'un loaddata, le code suivant est exécuté:

# If we found even one object in a fixture, we need to reset the
# database sequences.
if loaded_object_count > 0:
    sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
    if sequence_sql:
        if verbosity >= 2:
            self.stdout.write("Resetting sequences\n")
        for line in sequence_sql:
            cursor.execute(line)

Ce bout de code appelle la fonction postgresql pg_get_serial_sequence, avec en paramètre le nom de la table et le nom de la colonne, pour déterminer le nom de la séquence liée à la colonne. Puis avec le nom de la séquence, on fait un setval pour mettre à jour la dernière valeur.

Dans notre cas, la fonction pg_get_serial_sequence retournait NULL. Il manquait juste un bout de code pour lier la colonne à la séquence:

db.execute("ALTER SEQUENCE app_role_id_seq OWNED BY app_role.id")

Voici la migration complète:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_column('app_role', 'mygroup_ptr_id', 'id')
        # Petit cas particulier pour posgtresql
        if db.__module__ == 'south.db.postgresql_psycopg2':
            # Supression de la FK
            db.delete_foreign_key('app_role', 'id')
            # Création d'une séquence
            db.execute("CREATE SEQUENCE app_role_id_seq")
            # Avec set de la dernière valeur
            db.execute("SELECT setval('app_role_id_seq', (SELECT MAX(id) FROM app_role))")
            # Et ajout d'un default sur la nouvelle PK
            db.execute("ALTER TABLE app_role ALTER COLUMN id SET DEFAULT nextval('app_role_id_seq'::regclass)")
            # Liaison colonne - séquence
            db.execute("ALTER SEQUENCE app_role_id_seq OWNED BY app_role.id")
        else
            db.alter_column('app_role', 'id', self.gf('django.db.models.fields.AutoField')(primary_key=True))

Et voila ! :)

[Biologeek] Culture et entreprise

$
0
0

Plusieurs billets récemment sur la culture d'une entreprise, avec une première charge contre les startups qui sont dans l'adoption de pratiques plus que dans la transformation :

Culture is about power dynamics, unspoken priorities and beliefs, mythologies, conflicts, enforcement of social norms, creation of in/out groups and distribution of wealth and control inside companies. Culture is usually ugly. It is as much about the inevitable brokenness and dysfunction of teams as it is about their accomplishments. Culture is exceedingly difficult to talk about honestly.

What Your Culture Really Says

Suivi d'un billet de 37signals qui nous rappelle la différence entre culture d'entreprise et politique d'entreprise :

Culture nurtures pet projects so that they grow into everyday company tools. Policy steals 20% of your staff’s work hours to gamble on forced research and development.
Culture does. Policy says.
Culture encourages. Policy requires.
Culture empowers. Policy mandates.
Culture simply happens — it isn’t created.

When culture turns into policy

Et enfin Hubert en remet une couche avec la notion d'entreprise agile :

La conclusion de l’étude, jamais publiée, était que les entreprises qui avaient survécu étaient à la fois très décentralisées (c’est-à-dire qu’elles avaient des « frontières poreuses » et des « bords excentriques »), tout en ayant une très forte identité (c’est-à-dire des valeurs, une culture, des croyances).

[…]

« Trop souvent, on engage les gens pour leurs compétences, alors qu’il est aussi nécessaire de les engager pour leurs valeurs, afin que celles-ci soient en phase avec l’organisation qui les accueille »

[…]

La société a donc établi une carte culturelle, un petit carnet, qui évoque et explique les valeurs de la marque. « Plus qu’un manifeste, c’est un livret qui montre ce qui importe, qui se veut inspirant ». « Il ne faut pas planifier, il faut spéculer », clame l’entrepreneur.

[…]

Cette session laissait penser que les entreprises agiles, finalement, ne sont que des entreprises comme les autres. Peut-être est-ce finalement plus vrai que le contraire. A moins que l’agilité, ce buzzword à la mode, soit déjà dévoyé, rattrapé et assimilé par le vocabulaire du management. C’est en tout cas l’impression que pouvait laisser ces trois interventions, où l’agilité, ressemblait à une tranquille adaptation aux exigences du moment.

Agile, l’entreprise de demain ?

Je me pose beaucoup de questions au sujet de la culture d'une entreprise comme scopyleft et sur la manière de la partager et de la transmettre (ce que je vais tenter de faire lors de Devoxx). J'ai l'impression qu'il y a beaucoup plus qu'un manifeste ou des valeurs derrière ce terme mais une véritable relation. Un savant mélange de vécus, d'espoirs, de doutes, de rencontres, d'échecs, d'expériences, de concessions, de découvertes, de remises en questions et de fun. Or, une relation ne se raconte pas, elle se vit. Au quotidien. Intime.

[logilab] Profiling tools

$
0
0

Python

Run time profiling with cProfile

Python is distributed with profiling modules. They describe the run time operation of a pure python program, providing a variety of statistics.

The cProfile module is the recommended module. To execute your program under the control of the cProfile module, a simple form is

$ python -m cProfile -s cumulative mypythonscript.py

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      16    0.055    0.003   15.801    0.988 __init__.py:1(<module>)
       1    0.000    0.000   11.113   11.113 __init__.py:35(extract)
     135    7.351    0.054   11.078    0.082 __init__.py:25(iter_extract)
10350736    3.628    0.000    3.628    0.000 {method 'startswith' of 'str' objects}
       1    0.000    0.000    2.422    2.422 pyplot.py:123(show)
       1    0.000    0.000    2.422    2.422 backend_bases.py:69(__call__)
       ...

Each column provides information about time execution of every function calls. -s cumulative orders the result by descending cumulative time.

Note:

You can profile a particular python function such as main()

>>> import profile
>>> profile.run('main()')

Graphical tools to show profiling results

Even if report tools are included in cProfile profiler, it can be interesting to use graphical tools. Most of them work with a stat file that can be generated by cProfile using the -o filepath option.

Below are some of available graphical tools that we tested.

Gpro2Dot

is a python based tool that allows to transform profiling results output into a picture containing the call tree graph (using graphviz). A typical profiling session with python looks like this:

$ python -m cProfile -o output.pstats mypythonscript.py
$ gprof2dot.py -f pstats output.pstats | dot -Tpng -o profiling_results.png
http://wiki.jrfonseca.googlecode.com/git/gprof2dot.png

Each node of the output graph represents a function and has the following layout:

+----------------------------------+
|   function name : module name    |
| total time including sub-calls % |  total time including sub-calls %
|    (self execution time %)       |------------------------------------>
|  total number of self calls      |
+----------------------------------+

Nodes and edges are colored according to the "total time" spent in the functions.

Note:The following small patch let the node color correspond to the execution
ReST / HTML errors:System Message: WARNING/2 (&lt;string&gt; , line 74)</p>
Field list ends without a blank line; unexpected unindent.

time and the edge color to the "total time":

diff -r da2b31597c5f gprof2dot.py
--- a/gprof2dot.py      Fri Aug 31 16:38:37 2012 +0200
+++ b/gprof2dot.py      Fri Aug 31 16:40:56 2012 +0200
@@ -2628,6 +2628,7 @@
                 weight = function.weight
             else:
                 weight = 0.0
+            weight = function[TIME_RATIO]

             label = '\n'.join(labels)
             self.node(function.id,
PyProf2CallTree

is a script to help visualizing profiling data with the KCacheGrind graphical calltree analyzer. This is a more interactive solution than Gpro2Dot but it requires to install KCacheGrind. Typical usage:

$ python -m cProfile -o stat.prof mypythonscript.py
$ python pyprof2calltree.py -i stat.prof -k

Profiling data file is opened in KCacheGrind with pyprof2calltree module, whose -k switch automatically opens KCacheGrind.

http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif

There are other tools that are worth testing:

  • RunSnakeRun is an interactive GUI tool which visualizes profile file using square maps:

    $ python -m cProfile -o stat.prof mypythonscript.py
    $ runsnake stat.prof
    
  • pycallgraph generates PNG images of a call tree with the total number of calls:

    $ pycallgraph mypythonscript.py
    
  • lsprofcalltree also use KCacheGrind to display profiling data:

    $ python lsprofcalltree.py -o output.log yourprogram.py
    $ kcachegrind output.log
    

C/C++ extension profiling

For optimization purpose one may have python extensions written in C/C++. For such modules, cProfile will not dig into the corresponding call tree. Dedicated tools must be used (they are most part of Python) to profile a C++ extension from python.

Yep

is a python module dedicated to the profiling of compiled python extension. It uses the google CPU profiler:

$ python -m yep --callgrind mypythonscript.py

Memory Profiler

You may want to control the amount of memory used by a python program. There is an interesting module that fits this need: memory_profiler

You can fetch memory consumption of a program over time using

>>> from memory_profiler import memory_usage
>>> memory_usage(main, (), {})

memory_profiler can also spot lines that consume the most using pdb or IPython.

General purpose Profiling

The Linux perf tool gives access to a wide variety of performance counter subsystems. Using perf, any execution configuration (pure python programs, compiled extensions, subprocess, etc.) may be profiled.

Performance counters are CPU hardware registers that count hardware events such as instructions executed, cache-misses suffered, or branches mispredicted. They form a basis for profiling applications to trace dynamic control flow and identify hotspots.

You can have information about execution times with:

$ perf stat -e cpu-cycles,cpu-clock,task-clock python mypythonscript.py

You can have RAM access information using:

$ perf stat -e cache-misses python mypythonscript.py

Be careful about the fact that perf gives the raw value of the hardware counters. So, you need to know exactly what you are looking for and how to interpret these values in the context of your program.

Note that you can use Gpro2Dot to get a more user-friendly output:

$ perf record -g python mypythonscript.py
$ perf script | gprof2dot.py -f perf | dot -Tpng -o output.png

[logilab] Release of PyLint 0.27 / logilab-astng 0.24.2

$
0
0

Hi there,

I'm very pleased to announce the release of pylint 0.27 and logilab-astng 0.24.2. There has been a lot of enhancements and bug fixes since the latest release, so you're strongly encouraged to upgrade. Here is a detailed list of changes:

  • #20693: replace pylint.el by Ian Eure version (patch by J.Kotta)
  • #105327: add support for --disable=all option and deprecate the 'disable-all' inline directive in favour of 'skip-file' (patch by A.Fayolle)
  • #110840: add messages I0020 and I0021 for reporting of suppressed messages and useless suppression pragmas. (patch by Torsten Marek)
  • #112728: add warning E0604 for non-string objects in __all__ (patch by Torsten Marek)
  • #120657: add warning W0110/deprecated-lambda when a map/filter of a lambda could be a comprehension (patch by Martin Pool)
  • #113231: logging checker now looks at instances of Logger classes in addition to the base logging module. (patch by Mike Bryant)
  • #111799: don't warn about octal escape sequence, but warn about o which is not octal in Python (patch by Martin Pool)
  • #110839: bind <F5> to Run button in pylint-gui
  • #115580: fix erroneous W0212 (access to protected member) on super call (patch by Martin Pool)
  • #110853: fix a crash when an __init__ method in a base class has been created by assignment rather than direct function definition (patch by Torsten Marek)
  • #110838: fix pylint-gui crash when include-ids is activated (patch by Omega Weapon)
  • #112667: fix emission of reimport warnings for mixed imports and extend the testcase (patch by Torsten Marek)
  • #112698: fix crash related to non-inferable __all__ attributes and invalid __all__ contents (patch by Torsten Marek)
  • Python 3 related fixes:
    • #110213: fix import of checkers broken with python 3.3, causing "No such message id W0704" breakage
    • #120635: redefine cmp function used in pylint.reporters
  • Include full warning id for I0020 and I0021 and make sure to flush warnings after each module, not at the end of the pylint run. (patch by Torsten Marek)
  • Changed the regular expression for inline options so that it must be preceeded by a # (patch by Torsten Marek)
  • Make dot output for import graph predictable and not depend on ordering of strings in hashes. (patch by Torsten Marek)
  • Add hooks for import path setup and move pylint's sys.path modifications into them. (patch by Torsten Marek)
  • pylint-brain: more subprocess.Popen faking (see #46273)
  • #109562 [jython]: java modules have no __doc__, causing crash
  • #120646 [py3]: fix for python3.3 _ast changes which may cause crash
  • #109988 [py3]: test fixes

Many thanks to all the people who contributed to this release!

Enjoy!

[Inspyration] Dans vos kiosques : Du Python, du Python et ... encore du Python.

$
0
0
Python est à l'honneur en mars : 3 magazines pour 3 articles sur Python plus un hors-série consacré entièrement à notre langage préféré

[sciunto] Détection de cercles par une transformation de Hough dans scikit-image

$
0
0
Au détour de quelques questions que je me posais que la détection de forme, j’ai découvert les transformations de Hough. Ces transformations permettent, en jouant avec la géométrie de détecter par exemple des droites ou des cercles dans des images. Le principe est basé sur un accumulateur construit dans un espace réciproque à l’image dont [...]

[cubicweb] data.bnf.fr gets the Stanford Prize for Innovation in Research Libraries

[Biologeek] AirPlay et Freebox

$
0
0

Dans le cadre de mon approche militante de la consommation, j'envisage de quitter Free mais la seule fonctionnalité dont je me sers au quotidien et qui est difficile à trouver chez un fournisseur comme OVH ADSL est le support d'AirPlay permettant de streamer directement la musique depuis mon ordinateur ou téléphone vers la box en Wi-Fi et ensuite vers ma chaîne Hi-Fi en filaire.

J'ai donc demandé sur Twitter quelles étaient les alternatives à ce système et les réponses méritent d'être partagées :

Militer c'est renoncer à un certain confort. C'est ce que m'aura appris Yohan Boniface lors des rencontres Django 2012 il y a bientôt un an. Merci pour la leçon ;-).

Viewing all 3409 articles
Browse latest View live