Project Euler и другие конкурсы по программированию часто требуют максимального времени для запуска или люди хвастаются тем, как быстро работает их конкретное решение. В Python иногда подходы несколько запутанны - например, добавление временного кода в __main__.
Какой хороший способ определить, сколько времени требуется для запуска программы на Python?
Переведено автоматически
Ответ 1
В Python есть профилировщик с именем cProfile. Он не только показывает общее время выполнения, но и умножает время выполнения каждой функции в отдельности и сообщает вам, сколько раз вызывалась каждая функция, что упрощает определение того, где вам следует провести оптимизацию.
Вы можете вызвать его из своего кода или из интерпретатора, вот так:
import cProfile cProfile.run('foo()')
Еще более полезным является вызов cProfile при запуске скрипта:
python -m cProfile myscript.py
Или при запуске модуля:
python -m cProfile -m mymodule
Чтобы сделать это еще проще, я создал небольшой пакетный файл под названием "profile.bat":
Некоторое время назад я создал pycallgraph который генерирует визуализацию из вашего кода на Python. Редактировать: я обновил пример для работы с 3.3, последней версией на момент написания статьи.
После pip install pycallgraph и установки GraphViz вы можете запустить его из командной строки:
pycallgraph graphviz -- ./mypythonscript.py
Или вы можете профилировать определенные части вашего кода:
from pycallgraph import PyCallGraph from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()): code_to_profile()
Любой из этих способов сгенерирует pycallgraph.png файл, подобный изображению ниже:
Ответ 3
Стоит отметить, что использование профилировщика работает (по умолчанию) только в основном потоке, и вы не получите никакой информации из других потоков, если будете их использовать. Это может вызвать некоторые затруднения, поскольку совершенно не упоминается в документации по профилировщику.
and use that ProfiledThread class instead of the standard one. It might give you more flexibility, but I'm not sure it's worth it, especially if you are using third-party code which wouldn't use your class.