потребление памяти:
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) использую и в продакшене.