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 -pg
등gprof
(의 경우)Python 버전을 사용하는 경우gcc
(예를 들어 PSF가 배포하는 Windows의 프리 컴파일 버전)그 플랫폼과 툴 체인에 대해 어떤 동등한 툴이 존재하는지 조사해야 합니다(Windows PSF의 경우).mingw
도움이 됩니다)."관련되지 않은" 데이터가 있을 수 있습니다(Python 런타임의 내부 C 함수). 만약 있다면, 다음과 같이 표시됩니다.gprof
않을 수 단, 그는하며, 할 수 있습니다.gprof
의 출력(예를 들어 Python 스크립트를 약간 사용한 경우)을 사용하여 관련 없는 데이터를 제외하여 원하는 비율을 계산합니다.
언급URL : https://stackoverflow.com/questions/2615153/profiling-python-c-extensions
'programing' 카테고리의 다른 글
확인란에서 ID를 가져와 vue3에서 선택되었는지 확인하는 방법 (0) | 2022.07.28 |
---|---|
언제 C에서 malloc을 사용해야 하고 사용하지 말아야 하나요? (0) | 2022.07.28 |
수업에서 언제 "이거"를 사용해야 하나요? (0) | 2022.07.17 |
액세스할 수 없습니다.기본 설치 후 자녀 컴포넌트에 $store(vuex) (0) | 2022.07.17 |
Vue.js devtools Chrome 확장이 손상됨 - Vuex 탭이 비어 있고 구성 요소 탭이 새로 고침 후에만 표시됨 (0) | 2022.07.17 |