Я почти уверен, что cProfile использует execfile (). Подсказка исходит от документов (http://docs.python.org/library/profile.html):
Эта функция принимает один аргумент
которые могут быть переданы в exec
Заявление
execfile () не может выполнить файлы * .pyc и * .pyo - происходит сбой с тем же исключением.
>>> execfile("myscript.pyc")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tix_email.pyc", line 1
SyntaxError: Non-ASCII character '\xd1' in file tix_email.pyc on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Сценарий использования profile / cProfile для .pyc или .pyo, вероятно, просто никогда не рассматривался. Я не нашел канонического объяснения, почему это так, но обычно ожидается, что основные сценарии не будут скомпилированы байтами из-за способа работы интерпретатора cPython. Интерпретатор не будет автоматически компилировать байты основных сценариев, но будет делать это для импортированных модулей. Вот SO вопрос по теме: Почему Python компилирует модули, но не запускает скрипт?
Чтобы обойти вашу проблему, у вас могут быть сценарии запуска для вызова того, что вы обычно выполняете в качестве основного в .pyo, который вы хотели бы профилировать. Открытый код будет довольно тривиальным.
launch.py
import foo
foo.call_my_func()
А затем запустить:
python -m cProfile -o ./temp/PROFILE.log launch.py