2016-09-08 1 views
2

J'essaie de créer un module qui vous permette de faire la même chose que l'édition professionnelle de PyCharm, prendre un instantané de profil pendant l'exécution du programme, mais en tant que module au lieu d'une interface utilisateur toutCréer un script pProfile python pour profiler un autre script python contenu dans un répertoire différent

pour ce faire, je tentais d'abord faire un script qui reçoit un chemin vers un autre script et imprime le profil d'un script plus tard (je suppose toujours que le script plus tard a une principale).

Voici ce que je suis:

import cProfile 
import imp 

pr = cProfile.Profile() 
pr.disable() 
def profileScript(script): 
    pr.enable() 
    pr.run('script') 
    pr.disable() 
    pr.print_stats() 

if __name__ == '__main__': 
    script = imp.load_source('meihn','A:\TestProgram\meihn.py') 
    profileScript(script) 

et le script de test je suis le profilage:

def func1(a,b): 
    return a + b 

def func2(lista, listb): 
    listc = [] 
    for i in range(0, len(lista)): 
     listc.append(func1(lista[i],listb[i])) 
    return listc 

def func3(list): 
    a = 1 
    for i in list: 
     a *= i 
    return a 

if __name__ == '__main__': 
    for i in range(0, 1000): 
     la = [1, 2, 3, 4] 
     lb = [5, 5, 5, 5] 

     lc = func2(la, lb) 

     ld = func2(la, lc) 
     le = func2(lb, lc) 

    input() 

    for i in range(0, 10000): 
      lf = func3(le) 

    input() 

Il fonctionne mais il ne s'arrête pas aux entrées et le résultat est le suivant:

  5 function calls in 0.000 seconds 

Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.000 0.000 0.000 0.000 <string>:1(<module>) 
     1 0.000 0.000 0.000 0.000 cProfile.py:132(run) 
     1 0.000 0.000 0.000 0.000 cProfile.py:137(runctx) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     1 0.000 0.000 0.000 0.000 {method 'enable' of '_lsprof.Profiler' objects} 



Process finished with exit code 0 

ce qui me dit au fond, ce n'a pas appelé l'une des fonctions de meihn.py, je soppose c'est parce que il n'a pas appelé le principal pour une raison quelconque. Un commentaire à ce sujet ainsi que sur la façon de faire le snapshot asynchrone serait d'une grande aide.

J'utilise Python 2.7

Merci à l'avance.

Répondre

0

Je suis désolé de vous le casser, mais votre script de test n'a pas de fonction principale qui pourrait être appelée. :-)

De toute façon, j'obtiens les mêmes résultats pour mon script, qui a une fonction principale. Je suppose que le profileur ne peut simplement pas "voir à travers" votre mécanisme d'appel.

En regardant dans cProfile.py, je suis venu avec la solution suivante:

import os 
import sys 
import cProfile 

pr = cProfile.Profile() 
pr.disable() 


def profile_script(progname): 
    sys.path.insert(0, os.path.dirname(progname)) 
    with open(progname, 'rb') as fp: 
     code = compile(fp.read(), progname, 'exec') 
    globs = { 
     '__file__': progname, 
     '__name__': '__main__', 
     '__package__': None, 
    } 

    pr.enable() 
    pr.runctx(code, globs, None) 
    pr.disable() 
    pr.print_stats() 


if __name__ == '__main__': 
    profile_script('A:\TestProgram\meihn.py') 

Aussi, j'ai modifié votre script de test un peu, parce que l'utilisation input avec exec entraînera une erreur de syntaxe:

def func1(a, b): 
    return a + b 


def func2(lista, listb): 
    listc = [] 
    for i in range(0, len(lista)): 
     listc.append(func1(lista[i],listb[i])) 
    return listc 


def func3(list): 
    a = 1 
    for i in list: 
     a *= i 
    return a 


if __name__ == '__main__': 
    for i in range(0, 1000): 
     la = [1, 2, 3, 4] 
     lb = [5, 5, 5, 5] 

     lc = func2(la, lb) 

     ld = func2(la, lc) 
     le = func2(lb, lc) 

    raw_input('input: ') 

    for i in range(0, 10000): 
     lf = func3(le) 

    raw_input('input: ') 

Cela me donne:

  43098 function calls in 11.249 seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     4 0.000 0.000 0.000 0.000 Queue.py:107(put) 
     4 0.000 0.000 0.000 0.000 Queue.py:204(_put) 
     1 0.000 0.000 11.249 11.249 cProfile.py:137(runctx) 
     1 0.023 0.023 11.249 11.249 meihn.py:1(<module>) 
    12000 0.002 0.000 0.002 0.000 meihn.py:1(func1) 
    10000 0.010 0.000 0.010 0.000 meihn.py:12(func3) 
    3000 0.030 0.000 0.035 0.000 meihn.py:5(func2) 
     4 0.000 0.000 0.001 0.000 pydev_console_utils.py:145(__pydev_run_command) 
     2 0.000 0.000 11.180 5.590 pydev_console_utils.py:154(readline) 
     4 0.000 0.000 0.000 0.000 pydevd_comm.py:427(add_command) 
     4 0.000 0.000 0.000 0.000 pydevd_comm.py:567(__init__) 
     4 0.000 0.000 0.000 0.000 pydevd_comm.py:843(make_input_requested_message) 
     4 0.000 0.000 0.000 0.000 pydevd_utils.py:69(is_string) 
     4 0.000 0.000 0.000 0.000 pydevd_utils.py:72(to_string) 
     4 0.000 0.000 0.000 0.000 pydevd_utils.py:86(quote_smart) 
     4 0.000 0.000 0.000 0.000 threading.py:299(_is_owned) 
     4 0.000 0.000 0.000 0.000 threading.py:372(notify) 
     4 0.000 0.000 0.000 0.000 threading.py:63(_note) 
     4 0.000 0.000 0.000 0.000 urllib.py:1248(quote) 
     8 0.000 0.000 0.000 0.000 {isinstance} 
    3000 0.000 0.000 0.000 0.000 {len} 
     8 0.000 0.000 0.000 0.000 {method 'acquire' of 'thread.lock' objects} 
     4 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects} 
    12000 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects} 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     1 0.000 0.000 0.000 0.000 {method 'enable' of '_lsprof.Profiler' objects} 
     2 11.179 5.590 11.179 5.590 {method 'readline' of 'file' objects} 
     7 0.000 0.000 0.000 0.000 {method 'release' of 'thread.lock' objects} 
     3 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects} 
     4 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects} 
    3002 0.001 0.000 0.001 0.000 {range} 
     2 0.001 0.000 11.181 5.590 {raw_input}