Python Language
성능 최적화
수색…
비고
파이썬 스크립트의 성능을 향상 시키려면 스크립트의 병목 현상을 발견 할 수 있어야하며 최적화가 데이터 구조의 부실한 선택이나 알고리즘 설계의 결함을 보완 할 수는 없다는 점에 유의해야합니다. 성능 병목 현상을 확인하는 것은 스크립트를 프로파일 링 하여 수행 할 수 있습니다. 두 번째로 가독성 / 디자인 / 품질을 희생하면서 코딩 프로세스를 너무 일찍 최적화하려고하지 마십시오. Donald Knuth는 최적화에 대해 다음과 같이 설명했습니다.
"조기 최적화는 모든 악의 근원이며 시간의 약 97 %를 차지하는 작은 효율성을 잊어 버려야합니다. 그러나 우리는 그 중요한 3 %에서 기회를 포기해서는 안된다. "
코드 프로파일 링
무엇보다도 스크립트의 병목 현상을 발견 할 수 있어야하며 최적화가 데이터 구조의 부실한 선택이나 알고리즘 설계의 결함을 보완 할 수는 없다는 점에 유의해야합니다. 두 번째로 가독성 / 디자인 / 품질을 희생하면서 코딩 프로세스를 너무 일찍 최적화하려고하지 마십시오. Donald Knuth는 최적화에 대해 다음과 같이 설명했습니다.
"조기 최적화는 모든 악의 뿌리입니다. 그러나 중요한 3 %의 기회를 포기해서는 안됩니다."
코드를 프로파일 링하기 위해 표준 도구 인 line_profiler
및 timeit
cProfile
(또는 느린 profile
)과 같은 몇 가지 도구가 있습니다. 그들 각각은 다른 목적을 가지고 있습니다.
cProfile
은 determistic 프로파일 러입니다. 함수 호출, 함수 반환 및 예외 이벤트가 모니터링되며 이러한 이벤트 사이의 간격 (최대 0.001 초)에 대한 정확한 타이밍이 만들어집니다. 라이브러리 설명서 ([ https://docs.python.org/2/library/profile.html] [1 ]) 는 간단한 사용 사례를 제공합니다
import cProfile
def f(x):
return "42!"
cProfile.run('f(12)')
또는 기존 코드의 일부를 래핑하려면 다음을 수행하십시오.
import cProfile, pstats, StringIO
pr = cProfile.Profile()
pr.enable()
# ... do something ...
# ... long ...
pr.disable()
sortby = 'cumulative'
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print s.getvalue()
이렇게하면 아래 표와 같은 출력이 생성되어 프로그램에서 대부분의 시간을 보내는 곳을 빠르게보고 최적화 할 기능을 식별 할 수 있습니다.
3 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <stdin>:1(f)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
line_profiler
([ https://github.com/rkern/line_profiler][1]) 모듈은 코드를 한 줄씩 분석하는 데 유용합니다. 이것은 분명히 긴 스크립트에서는 다루기가 어렵지만 미리보기를 목표로합니다. 자세한 내용은 설명서를 참조하십시오. 가장 쉬운 방법은 패키지 페이지에서 설명한 kernprof 스크립트를 사용하는 것입니다. 프로파일 링 할 함수를 수동으로 지정해야합니다.
$ kernprof -l script_to_profile.py
kernprof는 LineProfiler의 인스턴스를 생성하고 이름 프로필을 사용하여 __builtins__
네임 스페이스에 삽입합니다. 데코레이터로 사용하도록 작성되었으므로 스크립트에서 @profile
으로 프로파일 링하려는 함수를 꾸미십시오.
@profile
def slow_function(a, b, c):
...
kernprof의 기본 동작은 결과를 바이너리 파일 script_to_profile.py.lprof
저장하는 script_to_profile.py.lprof
입니다. kernprof가 [-v / - view] 옵션을 사용하여 터미널에서 형식화 된 결과를 즉시 볼 수 있음을 알릴 수 있습니다. 그렇지 않으면 결과를 나중에 볼 수 있습니다.
$ python -m line_profiler script_to_profile.py.lprof
마지막으로 timeit
은 명령 행과 파이썬 쉘에서 하나의 라이너 또는 작은 표현식을 테스트하는 간단한 방법을 제공합니다. 이 모듈은 집합을 목록으로 변환 할 때 목록 이해 또는 list()
내장을 사용하는 것이 더 빠르다는 질문에 대답합니다. 설치 코드를 찾으려면 setup
키워드 또는 -s
옵션을 찾으십시오.
>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
터미널에서
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop