web-dev-qa-db-fra.com

Python interactif: impossible de faire fonctionner% lprun, bien que line_profiler soit importé correctement

Problème

La plupart des "fonctions magiques" iPython fonctionnent bien pour moi dès le départ: %hist, %time, %prun, etc. Cependant, j'ai remarqué que %lprun n'a pas pu être trouvé avec iPython car je l'avais installé à l'origine.

Tentative de résolution

J'ai alors découvert que je devrais installer le line_profiler module. J'ai installé ce module, mais je n'arrive toujours pas à faire fonctionner correctement la fonction magique. Si j'essaie d'appeler %lprun, iPython ne trouve toujours pas la fonction. Si je l'appelle avec le nom complet (line_profiler.magic_lprun), la fonction peut être trouvée, mais je ne peux pas la faire fonctionner du tout. Vous trouverez ci-dessous un exemple de ce que j'avais fait (extrait étape par étape du livre "Python for Data Analysis"):

Réussite avec %prun

[Dans:]

def add_and_sum(x, y):
    added = x + y
    summed = added.sum(axis=1)
    return summed

x = randn(3000, 3000)
y = randn(3000, 3000)

add_and_sum(x, y)

Avec cela, j'obtiens une réponse sympa, comme prévu:

[En dehors:]

array([-23.6223074 , -10.08590736, -31.2957222 , ..., -14.17271747,
    63.84057725, -50.28469621])

Et je peux faire la fonction magique de profilage %prun:

[Dans:]

%prun add_and_sum(x, y)

[En dehors:]

6 function calls in 0.042 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.020    0.020    0.029    0.029 <ipython-input-27-19f64f63ba0a>:1(add_and_sum)
    1    0.013    0.013    0.042    0.042 <string>:1(<module>)
    1    0.009    0.009    0.009    0.009 {method 'reduce' of 'numpy.ufunc' objects}
    1    0.000    0.000    0.009    0.009 _methods.py:16(_sum)
    1    0.000    0.000    0.009    0.009 {method 'sum' of 'numpy.ndarray' objects}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Échec de l'utilisation de %lprun

Mais quand j'essaie %lprun, Je ne peux rien obtenir:

[Dans:]

%lprun -f add_and_sum add_and_sum(x, y)

[En dehors:]

ERROR: Line magic function `%lprun` not found.

Et si j'essaie d'appeler la fonction avec son nom standard, cela ne fonctionne pas non plus:

[Dans:]

line_profiler.magic_lprun -f add_and_sum.test test.add_and_sum(x, y)

[En dehors:]

line_profiler.magic_lprun -f add_and_sum.test test.add_and_sum(x, y)
                                       ^
SyntaxError: invalid syntax

Mais la bibliothèque a été importée correctement, ou du moins c'est ce qu'elle dit:

[Dans:]

line_profiler

[En dehors:]

<module 'line_profiler' from '/Users/<edit>/anaconda/lib/python2.7/site-packages/line_profiler-1.0b3-py2.7-macosx-10.5-x86_64.Egg/line_profiler.pyc'>

[Dans:]

line_profiler.magic_lprun

[En dehors:]

<function line_profiler.magic_lprun>

Il semble qu'il y ait quelque chose en plus que je suis censé configurer pour que ces nouvelles fonctions magiques que j'ajoute puissent être identifiées comme telles. Je n'ai rien trouvé via une recherche sur le Web.

J'utilise Spyder en tant que IDE (toujours en utilisant iPython comme console), mais je l'ai également essayé directement avec iPython et avec le bloc-notes iPython. Je n'ai pas eu de chance dans n'importe quel format.

33
Mike Williamson

Vous avez deux façons de faire fonctionner %lprun, une solution est temporelle, c'est-à-dire qu'elle dure jusqu'à la fin de votre session ipython, et que l'autre est permanente.

Temporel: (comme réponse de Carlos Cordoba)

Après avoir démarré ipython exécutez ce qui suit:

In [1]: %load_ext line_profiler

Permanent:

Ajoutez les lignes suivantes à ~/.ipython/profile_default/ipython_config.py:

c.TerminalIPythonApp.extensions = [
    'line_profiler',
]

Si vous n'avez pas le fichier ~/.ipython/profile_default/ipython_config.py, vous pouvez le créer par (voir this pour plus d'informations):

ipython profile create
18
lmiguelvargasf

Faire %lprun travail, vous devez charger l'extension dans votre session, en utilisant cette commande:

In [1]: %load_ext line_profiler

Consultez ce carnet pour voir quelques exemples qui utilisent la magie.

En outre, si vous travaillez avec Spyder, il existe également un tiers line_profiler plugin, que vous pouvez trouver ici .

60
Carlos Cordoba