Профилирование Python, импорт (и особенно __init__) - это то, что занимает больше всего времени - PullRequest
0 голосов
/ 27 мая 2018

У меня есть скрипт, который, кажется, работает медленно и который я профилировал с использованием cProfile (и инструмента визуализации KCacheGrind )

Кажется, что почти 90% времени выполнения - этопоследовательность импорта, и особенно запуск файлов _ _ init _ _.py ...

Вот снимок экрана с выводом KCacheGrind (извините за прикрепление изображения ...)

enter image description here

Я не очень знаком с тем, как работает последовательность импорта в python, поэтому, возможно, я что-то запутал ... Я также поместил файлы _ _ init _ _.py в каждый из моих пользовательских пакетов, не уверенесли бы это было то, что я должен был сделать.

В любом случае, если у кого-то есть подсказка, мы будем очень благодарны!


РЕДАКТИРОВАТЬ: дополнительное изображение, когда функция сортируется по самому себе:

enter image description here


EDIT2:

здесь код прилагается, для большей ясности для отвечающих:

from strategy.strategies.gradient_stop_and_target import make_one_trade

from datetime import timedelta, datetime
import pandas as pd
from data.db import get_df, mongo_read_only, save_one, mongo_read_write, save_many
from data.get import get_symbols

from strategy.trades import make_trade, make_mae, get_prices, get_signals, \
    get_prices_subset
#from profilehooks import profile


mongo = mongo_read_only()


dollar_stop = 200
dollar_target = 400
period_change = 3


signal = get_df(mongo.signals.signals, strategy = {'$regex' : '^indicators_group'}).iloc[0]


symbol = get_symbols(mongo, description = signal['symbol'])[0]


prices = get_prices(
    signal['datetime'], 
    signal['datetime'].replace(hour = 23, minute = 59),
    symbol,
    mongo)


make_one_trade(
    signal, 
    prices, 
    symbol,             
    dollar_stop,
    dollar_target,
    period_change)

функция get_prices просто получает данные из базы данных mongo db, а make_one_trade dПростой расчет с пандами.Это никогда не создает проблем где-либо еще в моем проекте.


EDIT3:

Здесь экран измельчения Kcache, когда я выбираю опцию «обнаружить цикл» на вкладке «Просмотр»:

enter image description here

Может ли это на самом деле означать, что в моих автоматически созданных пакетах действительно есть циклический импорт, для решения которого требуется все это время?

1 Ответ

0 голосов
/ 27 мая 2018

Нет.Вы связываете совокупное время со временем, проведенным в коде верхнего уровня самого файла __init__.py.Код верхнего уровня вызывает другие методы, и те вместе занимают много времени.

Вместо этого посмотрите на столбец self , чтобы найти, где все это время находится.израсходованы.См. Также В чем разница между totaltime и cumtime в скрипте Python, профилированном с помощью cProfile? , столбец incl. - это совокупное время, self - это общее количество.время.

Я бы просто отфильтровал все записи <frozen importlib.*>;проект Python уже удостоверился, что эти пути оптимизированы.

Тем не менее, ваш второй снимок экрана показывает, что при выполнении профилирования все, с чем работал ваш код Python, загружало байт-код для импортируемых модулей (marshal модуль обеспечивает реализацию сериализации байт-кода Python).Либо программа Python ничего не делала, но импортировала модули и никакой другой работы не выполнялась, либо она использует какую-то форму динамического импорта, которая загружает большое количество модулей или иным образом игнорирует обычные кеши модулей и повторно загружает один и тот же модуль (и).

Вы можете профилировать время импорта, используя новый параметр командной строки Python 3.7 , или вы можете использовать выделенный import-profiler , чтобы выяснить это.почему импорт занимает так много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...