[PYTHON] Pythons timeit으로 성능을 테스트하기 위해 코드 세그먼트를 어떻게 시간을 잴 수 있습니까?
PYTHONPythons timeit으로 성능을 테스트하기 위해 코드 세그먼트를 어떻게 시간을 잴 수 있습니까?
나는 그것이해야하는 것처럼 작동하는 파이썬 스크립트를 가지고 있지만 실행 시간을 작성해야합니다. 나는 timeit를 사용해야한다고 봤지만 제대로 작동하지 않는 것 같습니다.
내 파이썬 스크립트는 다음과 같이 보입니다 :
import sys
import getopt
import timeit
import random
import os
import re
import ibm_db
import time
from string import maketrans
myfile = open("results_update.txt", "a")
for r in range(100):
rannumber = random.randint(0, 100)
update = "update TABLE set val = %i where MyCount >= '2010' and MyCount < '2012' and number = '250'" % rannumber
#print rannumber
conn = ibm_db.pconnect("dsn=myDB","usrname","secretPWD")
for r in range(5):
print "Run %s\n" % r
ibm_db.execute(query_stmt)
query_stmt = ibm_db.prepare(conn, update)
myfile.close()
ibm_db.close(conn)
필요한 것은 쿼리를 실행하여 results_update.txt 파일에 쓰는 데 걸리는 시간입니다. 그 목적은 다른 인덱스와 조정 메커니즘을 사용하여 데이터베이스의 업데이트 문을 테스트하는 것입니다.
해결법
-
==============================
1.time.time () 또는 time.clock ()을 사용하여 시간을 지정하려는 블록 앞뒤에 사용할 수 있습니다.
time.time () 또는 time.clock ()을 사용하여 시간을 지정하려는 블록 앞뒤에 사용할 수 있습니다.
import time t0 = time.time() code_block t1 = time.time() total = t1-t0
이 방법은 timeit만큼 정확하지는 않습니다 (몇 번의 실행을 평균하지는 않습니다)하지만 간단합니다.
time.time () (Windows 및 Linux의 경우) 및 time.clock () (Linux의 경우)은 빠른 기능을 위해 충분히 정확하지 않습니다 (총 = 0을 얻음). 이 경우 또는 여러 번 실행 한 시간의 평균을 계산하려면 수동으로 함수를 여러 번 호출해야합니다 (예를 들어 코드 예제에서 이미 생각한 것처럼 number 인수를 설정하면 자동으로 timeit이 수행됩니다)
import time def myfast(): code n = 10000 t0 = time.time() for i in range(n): myfast() t1 = time.time() total_n = t1-t0
Windows에서 Corey가 주석에 명시한대로 time.clock ()은 훨씬 높은 정밀도 (초 단위가 아닌 마이크로 초)를 가지며 time.time ()보다 선호됩니다.
-
==============================
2.코드를 프로파일 링하고 IPython을 사용할 수 있다면, 그것은 마술 함수 % timeit을가집니다.
코드를 프로파일 링하고 IPython을 사용할 수 있다면, 그것은 마술 함수 % timeit을가집니다.
%% timeit은 셀에서 작동합니다.
In [2]: %timeit cos(3.14) 10000000 loops, best of 3: 160 ns per loop In [3]: %%timeit ...: cos(3.14) ...: x = 2 + 3 ...: 10000000 loops, best of 3: 196 ns per loop
-
==============================
3.타이밍과는 별도로,이 코드는 단순히 잘못된 것입니다. 즉, 100 개의 연결을 실행하고 (마지막 하나를 제외한 모든 연결을 완전히 무시한 후) 첫 번째 실행 호출을하면 그 후에 만 초기화 한 로컬 변수 query_stmt를 전달합니다. 호출을 실행하십시오.
타이밍과는 별도로,이 코드는 단순히 잘못된 것입니다. 즉, 100 개의 연결을 실행하고 (마지막 하나를 제외한 모든 연결을 완전히 무시한 후) 첫 번째 실행 호출을하면 그 후에 만 초기화 한 로컬 변수 query_stmt를 전달합니다. 호출을 실행하십시오.
먼저 타이밍에 대해 걱정할 필요없이 올바른 코드를 만드십시오. 즉, 연결을 설정하거나 수신하고 해당 연결에서 100 또는 500 또는 임의의 수의 업데이트를 수행 한 다음 연결을 닫는 기능. 코드가 제대로 작동하면 timeit을 사용하는 방법에 대해 생각해보십시오.
특히, 시간을 내고자하는 함수가 매개 변수가없는 foobar라고 불리우는 경우 timeit.timeit (2.6 이상 - 2.5 이전에는 더 복잡함)을 사용할 수 있습니다.
timeit.timeit('foobar()', number=1000)
기본 코드 인 백만 개가 사용 사례에 따라 높을 수 있으므로 실행 횟수를 지정하는 것이 좋습니다 (이 코드에서 많은 시간을 소비하게됩니다.).
-
==============================
4.특정 한 가지에만 집중하십시오. 디스크 입출력 속도가 느리므로 모든 작업을 데이터베이스 쿼리로 조정하면 테스트에서 제외됩니다.
특정 한 가지에만 집중하십시오. 디스크 입출력 속도가 느리므로 모든 작업을 데이터베이스 쿼리로 조정하면 테스트에서 제외됩니다.
또한 데이터베이스 실행 시간을 단축해야하는 경우 쿼리 계획을 요구하는 것과 같이 데이터베이스 도구를 찾아보고 정확한 쿼리와 인덱스 만 다를뿐만 아니라 데이터로드 (데이터로드 (데이터의 양 당신은 저장했습니다).
즉, 함수에 코드를 넣고 timeit.timeit ()을 사용하여 해당 함수를 실행할 수 있습니다.
def function_to_repeat(): # ... duration = timeit.timeit(function_to_repeat, number=1000)
이렇게하면 가비지 콜렉션이 비활성화되고 function_to_repeat () 함수가 반복적으로 호출되며 timeit.default_timer ()를 사용하여 해당 호출의 총 지속 시간이 계산됩니다. timeit.default_timer ()는 특정 플랫폼에 대해 가장 정확한 사용 가능 클럭입니다.
반복되는 기능에서 설정 코드를 이동해야합니다. 예를 들어 데이터베이스에 먼저 연결 한 다음 쿼리 만 시간을 측정해야합니다. 설정 인수를 사용하여 이러한 종속성을 가져 오거나 작성한 다음 함수에 전달하십시오.
def function_to_repeat(var1, var2): # ... duration = timeit.timeit( 'function_to_repeat(var1, var2)', 'from __main__ import function_to_repeat, var1, var2', number=1000)
스크립트에서 전역 함수 function_to_repeat, var1 및 var2를 가져 와서 반복 할 때마다 함수에 전달합니다.
-
==============================
5.질문에 대한 답변은 이미 있지만 2 센트를 추가하고 싶습니다.
질문에 대한 답변은 이미 있지만 2 센트를 추가하고 싶습니다.
비슷한 시나리오에 직면 해 여러 접근법에 대한 실행 시간을 테스트해야하고 작은 스크립트를 작성해야합니다.이 스크립트는 작성된 모든 함수에 대해 timeit을 호출합니다.
이 스크립트는 github gist로도 제공됩니다.
그것이 당신과 다른 사람들을 도울 수 있기를 바랍니다.
from random import random import types def list_without_comprehension(): l = [] for i in xrange(1000): l.append(int(random()*100 % 100)) return l def list_with_comprehension(): # 1K random numbers between 0 to 100 l = [int(random()*100 % 100) for _ in xrange(1000)] return l # operations on list_without_comprehension def sort_list_without_comprehension(): list_without_comprehension().sort() def reverse_sort_list_without_comprehension(): list_without_comprehension().sort(reverse=True) def sorted_list_without_comprehension(): sorted(list_without_comprehension()) # operations on list_with_comprehension def sort_list_with_comprehension(): list_with_comprehension().sort() def reverse_sort_list_with_comprehension(): list_with_comprehension().sort(reverse=True) def sorted_list_with_comprehension(): sorted(list_with_comprehension()) def main(): objs = globals() funcs = [] f = open("timeit_demo.sh", "w+") for objname in objs: if objname != 'main' and type(objs[objname]) == types.FunctionType: funcs.append(objname) funcs.sort() for func in funcs: f.write('''echo "Timing: %(funcname)s" python -m timeit "import timeit_demo; timeit_demo.%(funcname)s();"\n\n echo "------------------------------------------------------------" ''' % dict( funcname = func, ) ) f.close() if __name__ == "__main__": main() from os import system #Works only for *nix platforms system("/bin/bash timeit_demo.sh") #un-comment below for windows #system("cmd timeit_demo.sh")
from https://stackoverflow.com/questions/2866380/how-can-i-time-a-code-segment-for-testing-performance-with-pythons-timeit by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python으로 파일의 마지막 x 줄을 검색하는 가장 효율적인 방법 (0) | 2018.10.10 |
---|---|
[PYTHON] MAPI를 통해 Python으로 Outlook에서 전자 메일 읽기 (0) | 2018.10.10 |
[PYTHON] numpy 배열에서 특정 요소를 제거하는 방법 (0) | 2018.10.10 |
[PYTHON] Word 2007 .docx 파일에서 단어를 검색하려면 어떻게해야합니까? (0) | 2018.10.10 |
[PYTHON] matplotlib에서 subplots 사이의 간격을 제거하는 방법? (0) | 2018.10.10 |