programing

python C 확장 프로파일링

newsource 2022. 7. 28. 23:55

python C 확장 프로파일링

Python으로부터 데이터를 수신해, CPU 집약적인 계산을 실시하는 Python C-Extension을 개발했습니다.C 확장자를 프로파일 할 수 있나요?

여기서 문제는 샘플테스트를 프로파일링하기 위해 C에 작성하는 것이 어렵다는 것입니다.이는 코드가 특정 입력과 데이터 구조(파이썬 제어 코드에 의해 생성됨)에 의존하기 때문입니다.

제안할 것이 있습니까?

pygabriel의 코멘트 후, 저는 pypi에 패키지를 업로드하기로 결정했습니다. 패키지는 pypi 확장용 프로파일러를 사용하여 google-perftools의 cpu-profiler를 사용하여 구현됩니다.

나는 구글 퍼프툴을 이용해서 내 길을 찾았다.StartProfiler와 StopProfiler 함수를 python(내 경우 cython을 통해)으로 감싸는 것이 요령이었다.

C 내선번호를 프로파일 하는 것은 StartProfiler 콜과 StopProfiler 콜 내에서 python 코드를 랩하는 데 충분합니다.

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()

그런 다음 예를 들어 분석하려면 콜그린드 형식으로 내보내고 결과를 kcachegrind로 표시할 수 있습니다.

pprof --callgrind c_extension.so output.prof > output.callgrind 
kcachegrind output.callgrind

py-spy는 매우 사용하기 쉬웠다.네이티브 확장 지원에 대한 자세한 내용은 이 블로그 게시물을 참조하십시오.

특징:

  • pip 설치 가능
  • cpu 샘플링 베이스
  • 컴파일러 플래그가 필요 없음
  • 프로그램을 실행하거나 실행 중인 프로세스에 접속합니다.
  • 여러 출력 형식(권장)--format speedscope)
  • 설정 가능한 샘플링 레이트

내 동료 중 한 명이 나에게 말했다.ltrace(1)같은 상황에서 많은 도움이 되었습니다.

C 확장의 공유 객체 이름은 다음과 같습니다.myext.so실행하려고 합니다.benchmark.py,그리고나서

ltrace -x @myext.so -c python benchmark.py

출력은 다음과 같습니다.

% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 24.88   30.202126     7550531         4 ldap_result
 12.46   15.117625     7558812         2 l_ldap_result4
 12.41   15.059652     5019884         3 ldap_chase_v3referrals
 12.41   15.057678     3764419         4 ldap_new_connection
 12.40   15.050310     3762577         4 ldap_int_open_connection
 12.39   15.042360     3008472         5 ldap_send_server_request
 12.38   15.029055     3757263         4 ldap_connect_to_host
  0.05    0.057890       28945         2 ldap_get_option
  0.04    0.052182       26091         2 ldap_sasl_bind
  0.03    0.030760       30760         1 l_ldap_get_option
  0.03    0.030635       30635         1 LDAP_get_option
  0.02    0.029960       14980         2 ldap_initialize
  0.02    0.027988       27988         1 ldap_int_initialize
  0.02    0.026722       26722         1 l_ldap_simple_bind
  0.02    0.026386       13193         2 ldap_send_initial_request
  0.02    0.025810       12905         2 ldap_int_select
....

공유 객체가 다음과 같은 경우 각별한 주의가 필요합니다.-또는+파일명을 지정합니다.이러한 문자는 그대로 취급되지 않습니다( 참조).man 1 ltrace자세한 내용은 를 참조).

와일드카드*같은 회피책이 될 수 있다-x @myext*대신해서-x @myext-2.so.

gprof를 사용하면 적절하게 컴파일 및 링크된 모든 프로그램을 프로파일링할 수 있습니다.gcc -pggprof(의 경우)Python 버전을 사용하는 경우gcc(예를 들어 PSF가 배포하는 Windows의 프리 컴파일 버전)그 플랫폼과 툴 체인에 대해 어떤 동등한 툴이 존재하는지 조사해야 합니다(Windows PSF의 경우).mingw도움이 됩니다)."관련되지 않은" 데이터가 있을 수 있습니다(Python 런타임의 내부 C 함수). 만약 있다면, 다음과 같이 표시됩니다.gprof않을 수 단, 그는하며, 할 수 있습니다.gprof의 출력(예를 들어 Python 스크립트를 약간 사용한 경우)을 사용하여 관련 없는 데이터를 제외하여 원하는 비율을 계산합니다.

언급URL : https://stackoverflow.com/questions/2615153/profiling-python-c-extensions