Запустите cProfile над списком файлов в Python - PullRequest
0 голосов
/ 29 октября 2018

Я исследовал другие статьи SOF о том, как это сделать, и долгое время возился с кодом, никуда не деться. Я также смотрел видео YouTube о профилировании и пробовал примеры в документации cProfile, и они, похоже, не охватывают итерации. Кажется, никто не обсуждает использование cProfile для файлов в итерируемом объекте.

Итак, сейчас у меня есть то, что все еще не работает. Что не работает? Ну, cProfile.py использует рекурсию и не может перейти к следующему файлу для повторения.

Я пробовал рекурсивную функцию цикла, для цикла, и это не имеет значения. Как только __iter__ и __next__, кажется, подобраны cProfile.py, cProfile.py, кажется, попадает в бесконечный цикл. Я должен использовать 32-битный Python, поэтому этот код будет запускаться из 1 или 2 файлов в списке, снова и снова, пока Python не выдаст MemoryError.

Я хочу запустить некоторый код для создания списка файлов, выполнить итерацию по списку и запустить cProfile.run() _or или вызывать для них командную функцию Python.

Мне нужно изменить предел рекурсии, чтобы в моем коде не было ошибки рекурсии, но затем он просто работает до бесконечного большего предела рекурсии. Я не хочу делать это вообще. Фактически, он будет обрабатывать 2 файла в списке одновременно и никогда не будет двигаться дальше. Я попытался добавить аргументы командной строки, которая все еще не работает, потому что проблема, кажется, исходит из cProfile.py и как я его использую.

from subprocess import call
from glob import glob
from sys import argv, setrecursionlimit

setrecursionlimit(10000)
files = glob('**/*.py', recursive=True)

def run_cProfile(file):
    call(['python', '-m', 'cProfile', '-s', 'ncalls', file])

for file in files:
    if file == argv[0]:
        continue
    print('Processing file: {}'.format(file))
    run_cProfile(file)

Вывод выводит то, что вы ожидаете от cProfile, но он просто делает это с тем же файлом в списке, пока я не получу MemoryError или RecursionError.

Общая картина заключается в том, что я пишу программу командной строки, которая будет запускать различные внешние профилировщики для файлов, передаваемых в качестве аргументов командной строки, анализировать результаты и сохранять данные в плоский файл для анализа. Я не хочу изменять какой-либо код для этих профилировщиков для запуска и создания отчета. Это может быть отдельный проект.

Ваша помощь будет принята с благодарностью.

Спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

Условие if file == argv[0]: не остановит вас от повторного вызова того же сценария, потому что вы проверяете полный путь исходного сценария к путям сценариев, найденных glob, которые относятся к текущему каталогу). Э.Г.

print(argv[0])
print(file)

/home/yourlogin/startscript.py
startscript.py

Вы можете изменить его на:

from os import path

for file in files:
    _, startname = path.split(argv[0])
    if file == startname:
        continue
    print('Processing file: {}'.format(file))
    run_cProfile(file)
...