Я разработал C-расширение Python, которое получает данные из Python, и вычислите некоторый CPU интенсивные вычисления. Возможно представить C-расширение?
Проблема здесь состоит в том, что запись демонстрационного теста в C, который будет представлен, была бы сложна, потому что код полагается на конкретные исходные данные и структуры данных (сгенерированный кодом управления Python).
У Вас есть какие-либо предложения?
Я нашел свой путь, используя google-perftools . Хитрость заключалась в том, чтобы обернуть функции StartProfiler и StopProfiler в python (в моем случае через cython).
Для профилирования расширения C достаточно обернуть код Python внутри вызовов StartProfiler и StopProfiler.
from google_perftools_wrapped import StartProfiler, StopProfiler
import c_extension # extension to profile c_extension.so
StartProfiler("output.prof")
... calling the interesting functions from the C extension module ...
StopProfiler()
Затем для анализа, например, вы можете экспортировать в формате callgrind и увидеть результат в kcachegrind:
pprof --callgrind c_extension.so output.prof > output.callgrind
kcachegrind output.callgrind
С помощью gprof вы можете профилировать любую программу, которая была правильно скомпилирована и связана ( gcc -pg
и т. Д., В gprof
' s случае). Если вы используете версию Python, не созданную с помощью gcc
(например, предварительно скомпилированную версию Windows, распространяемую PSF), вам необходимо изучить, какие эквивалентные инструменты существуют для этой платформы и набора инструментов (в Windows PSF случай, возможно, mingw
может помочь). Там могут быть "нерелевантные" данные (внутренние функции C в среде выполнения Python), и если да, то проценты, показанные gprof
, могут быть неприменимы, но абсолютные числа (вызовов и продолжительности) из этого) по-прежнему действительны, и вы можете постобработать вывод gprof
(например, с помощью небольшого скрипта Python ;-), чтобы исключить нерелевантные данные и вычислить желаемые проценты.