Подтвердить что ты не робот

Профилирование расширений python C

Я разработал C-расширение python, которое получает данные от python и вычисляет некоторые интенсивные вычисления процессора. Можно ли профилировать C-расширение?

Проблема заключается в том, что писать образец теста на C, который должен быть профилирован, было бы сложным, потому что код полагался на определенные входы и структуры данных (сгенерированные кодом управления python).

Есть ли у вас какие-либо предложения?

4b9b3361

Ответ 1

Я нашел свой способ, используя google-perftools. Трюк состоял в том, чтобы обернуть функции StartProfiler и StopProfiler в python (в нашем случае ctyth cython).

Профилировать расширение C достаточно, чтобы обернуть код python внутри вызовов StartProfiler и StopProfiler.

from google_perftools_wrapped import StartProfiler, StopProfiler
impor 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

Ответ 2

После комментария pygabriel я решил загрузить пакет в pypi, который реализует профайлер для расширений python, используя cpu-profiler из google-perftools: http://pypi.python.org/pypi/yep

Ответ 3

С gprof вы можете профилировать любую программу, которая была правильно скомпилирован и связан (gcc -pg и т.д. в случае gprof). Если вы используете версию Python, не построенную с помощью gcc (например, предварительно скомпилированную версию Windows, распространяемую PSF), вам нужно исследовать, какие эквивалентные инструменты существуют для этой платформы и инструментальной цепочки (в случае Windows PSF, возможно, mingw может помочь). Там могут быть "нерелевантные" данные (внутренние функции C в среде исполнения Python), и если это так, то проценты, показанные gprof, могут быть неприменимы, но абсолютные числа (вызовов и продолжительности их) все еще остаются действителен, и вы можете выполнить пост-обработку вывода gprof (например, с небольшим Python script;-), чтобы исключить нерелевантные данные и вычислить проценты, которые вы хотите.