Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

utiliser line_profiler dans django

+5 votes

je suis tombé sur cet article et aurait aimé pouvoir utiliser line_profiler avec django mais pas dans une vue (donc pas avec django-devserver)
classiquement, pour faire analyser les perf d'un module on ajoutera un décorateur à la fonction à faire analyser puis on lancera kernprof et le tour est joué.

Seulement quand je lance une managed command (un batch quoi) ca ne me génère bien evidement pas le fichier .lprof puisque je ne lance pas kernprof lui même.
Mes managed command lancent des tasks celery, et j'aimerai pouvoir déjà démarré par l'analyse de fonctions de ces tâches et creuser plus bas si besoin en rajoutant des @profile sur d'autre fonctions "gourmandes" appelées à leur tour par les tasks celery.

Comment s'y prend on ?

demandé 29-Jun-2015 par foxmask (2,888 points)
edité 29-Jun-2015 par max

fiasco total cet outil ...

Il me crache toutes les fonctions surlquelles j'ai pose @profile sans jamais executer le code de ma "management command" ...

meme en suivant les exemples fournis https://github.com/rkern/line_profiler ; rien de rien s'affiche aucun hit aucun time ; aucun time per hit rien nada...

Ca sent le truc où il faudrait être à côté pour debugger pour t'aider.

Pas grave, c'était juste pour prendre le température du code avant d'ouvrir le service aux autres et pas écroyler le serveur

Tiens j'ai reussi a faire tourner un test bidon localement

my_hour.py

@profile
def do_stuff():
     print( open('filename.txt', 'r').read().split(':') )


@profile
def do_stiff():
    print("wake up little Suzie")
    do_stuff()

lets_go.py

from my_hour import do_stiff
@profile
def do_dou():
   do_stiff()

nomdidiou.py

from lets_go import do_dou
do_dou()

donne :

kernprof -l -v nomdidiou.py 
wake up little Suzie
['15', '58\n']
Wrote profile results to nomdidiou.py.lprof
Timer unit: 1e-06 s

Total time: 0.000117 s
File: /home/foxmask/venv/toto/lets_go.py
Function: do_dou at line 2

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     2                                           @profile
     3                                           def do_dou():
     4         1          117    117.0    100.0     do_stiff()

Total time: 7.6e-05 s
File: /home/foxmask/venv/toto/my_hour.py
Function: do_stuff at line 2

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     2                                           @profile
     3                                           def do_stuff():
     4         1           76     76.0    100.0      print( open('filename.txt', 'r').read().split(':') )

Total time: 0.000111 s
File: /home/foxmask/venv/toto/my_hour.py
Function: do_stiff at line 7

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     7                                           @profile
     8                                           def do_stiff():
     9         1           28     28.0     25.2      print("wake up little Suzie")
    10         1           83     83.0     74.8      do_stuff()

A présent cote "django" pour appliquer le profiling, il faut que je bypass la management command et fasse un module con qui contienne l'import de tasks et l'execute

from django_th.tasks import read_data
read_data()

dans tasks.py j'ai mis @profile a 2 endroits mais ce coup ci j'ai droit à une exception :

$ kernprof -l -v test.py
trigger vaut  Wrote profile results to test.py.lprof
Timer unit: 1e-06 s

Total time: 0 s
File: [...]/th/django_th/tasks.py
Function: put_in_cache at line 51

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    51                                           @profile
    52                                           def put_in_cache(service):
[...] ici ca reste muet .... 

Total time: 0.004409 s
File: [...]/th/django_th/tasks.py
Function: read_data at line 105

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   105                                           @profile
   106                                           def read_data():
   107                                               """
   108                                                   The purpose of this tasks is to put data in cache
   109                                                   because of the read_data function of each
   110                                                   service
   111                                               """
   112         1          663    663.0     15.0      trigger = TriggerService.objects.filter(status=True).select_related(
   113         1           99     99.0      2.2          'consumer__name', 'provider__name')
   114         1         3647   3647.0     82.7      print("trigger vaut ", trigger)
   115                                               if trigger:
   116                                                   for service in trigger:
   117                                                       put_in_cache(service)

Traceback (most recent call last):
  File "[...]/bin/kernprof", line 9, in <module>
    load_entry_point('line-profiler==1.0', 'console_scripts', 'kernprof')()
  File "[...]/lib/python3.4/site-packages/kernprof.py", line 221, in main
    execfile(script_file, ns, ns)
  File "[...]/lib/python3.4/site-packages/kernprof.py", line 34, in execfile
    exec_(compile(f.read(), filename, 'exec'), globals, locals)
  File "test.py", line 3, in <module>
    read_data()
  File "[...]/lib/python3.4/site-packages/line_profiler.py", line 99, in wrapper
    result = func(*args, **kwds)
  File "[...]/th/django_th/tasks.py", line 114, in read_data
    print("trigger vaut ", trigger)
  File "[...]/lib/python3.4/site-packages/django/db/models/query.py", line 138, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "[...]/lib/python3.4/site-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "[...]/lib/python3.4/site-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
  File "[...]/lib/python3.4/site-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 829, in execute_sql
    sql, params = self.as_sql()
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 378, in as_sql
    extra_select, order_by, group_by = self.pre_sql_setup()
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 48, in pre_sql_setup
    self.setup_query()
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 39, in setup_query
    self.select, self.klass_info, self.annotation_col_map = self.get_select()
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 206, in get_select
    related_klass_infos = self.get_related_selections(select)
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 700, in get_related_selections
    [f.name], opts, root_alias)
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1466, in setup_joins
    names, opts, allow_many, fail_on_missing=True)
  File "[...]/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1367, in names_to_path
    if field.is_relation and not field.related_model:
  File "[...]/lib/python3.4/site-packages/django/utils/functional.py", line 60, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "[...]/lib/python3.4/site-packages/django/db/models/fields/related.py", line 110, in related_model
    apps.check_models_ready()
  File "[...]/lib/python3.4/site-packages/django/apps/registry.py", line 131, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

pour autant j'ai bien pondu un apps.py :

apps.py

from django.apps import AppConfig

class ThConfig(AppConfig):
    name = 'th'
    verbose_name = "Trigger Happy Web Site"

bon j'avance, mais à patte de moucheron ...

un truc vient d'être publié sur le sujet http://agiliq.com/blog/2015/07/profiling-django-middlewares/ un middleware qui irait utiliser cProfile pour mesurer ce qui prend le plus de ressources.

à tester ; à suivre ;)

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...