[python] 성능 측정, 프로파일링(profiling)
PyCharm같은 IDE에서도 지원하기 때문에, 굳이 직접 돌리지 않아도 된다.
상단에 Run, Debug 아이콘 옆에 보면 프로파일링 다양하게 지원함.
python 기본 내장 라이브러리
benchmarking 목적 : timeit
profiling 목적 : cProfile
근데, 시스템 함수까지 다 출력되어 보기 불편하고 복잡하다.
``bash python -m cProfile -s cumulative file.py``
진짜 간단하게 함수의 수행 시간을 측정하고 싶을 때 : timeit
```python
from timeit import timeit
def mkList1():
result = []
for value in range(1000):
result.append(value)
return result
def mkList2():
result = [value for value in range(1000)]
return result
print("mkList1 : ", timeit(mkList1, number=1000), "s")
print("mkList2 : ", timeit(mkList2, number=1000), "s")
```
```
D:\Source\RAPTs
λ python test.py
mkList1 : 0.060883758620756026 s
mkList2 : 0.023483359671190612 s
```
line_profiler
line 단위로 프로파일링 하려면 line_profiler를 사용하거나, 다른 서드파티 라이브러리를 사용해야한다.
line_profiler와 flame graph가 대중적인 듯.
프로파일링 대상 함수에 ``python @profile``을 붙인다.
```python
@profile
def predict(self, x):
for layer in self.layers.values():
x = layer.forward(x)
return x
```
```bash
$ kernprof [-v] -l script_to_profile.py
```
`` script_to_profile.py.lprof`` 파일이 생성된다. 이 파일에 프로파일링 결과가 저장되어 있다.
`` -v``옵션을 주면 생성 즉시 파일 내용을 확인할 수 있다.
`` .lprof`` 파일을 실행하려면
```bash
$ python -m line_profiler script_to_profile.py.lprof
```
etc profiler
- memory_profiler
- heapy
- dowser
'Languages & Frameworks > Python' 카테고리의 다른 글
[python] 헷갈리는 모듈 스코프 변수, 전역 변수처럼 쓸 수 있을까? - 아니. class level 변수를 쓰자. (0) | 2019.02.04 |
---|---|
[python] pdb : 디버깅 (0) | 2018.11.12 |
[python] socket (0) | 2018.11.10 |
[python] Flask (0) | 2018.11.05 |
[python] docstring, 문서화 (0) | 2018.10.15 |