Как мониторить медленные и прожорливые места скрипта?
потребление памяти: https://pypi.python.org/pypi/memory_profiler
Для замера времени выполнения в боевых условиях использую обычно такой менеджер контекста:class Profiler(object):
    def __init__(self, message_format='Elapsed time: {:.3f} sec'):
        self._message_format = message_format

    def __enter__(self,):
        self._startTime = time.time()

    def __exit__(self, rtype, value, traceback):
        print(self._message_format.format(time.time() - self._startTime))
использовать крайне просто:with Profiler():
    <код время выполнения которого необходимо замерить>
1. Код программы почти не нуждается в изменении.
2. минимальные накладные расходы(крайне важно поскольку "нормальные" профилировщики сильно всё затормаживают, но и выдают гораздо более детальную информацию)
3. замерит время в любом случае, если даже произойдёт исключение.
4. аналогичную конструкцию(с минимальными изменениями для работы с logging) использую и в продакшене.
По мониторингу быстродействия есть хороший доклад с обзором инструментов и примерами:
https://moscowdjango.ru/meetup/13/profiling-django/