복붙노트

[PYTHON] Pythons timeit으로 성능을 테스트하기 위해 코드 세그먼트를 어떻게 시간을 잴 수 있습니까?

PYTHON

Pythons 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. ==============================

    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. ==============================

    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. ==============================

    3.타이밍과는 별도로,이 코드는 단순히 잘못된 것입니다. 즉, 100 개의 연결을 실행하고 (마지막 하나를 제외한 모든 연결을 완전히 무시한 후) 첫 번째 실행 호출을하면 그 후에 만 ​​초기화 한 로컬 변수 query_stmt를 전달합니다. 호출을 실행하십시오.

    타이밍과는 별도로,이 코드는 단순히 잘못된 것입니다. 즉, 100 개의 연결을 실행하고 (마지막 하나를 제외한 모든 연결을 완전히 무시한 후) 첫 번째 실행 호출을하면 그 후에 만 ​​초기화 한 로컬 변수 query_stmt를 전달합니다. 호출을 실행하십시오.

    먼저 타이밍에 대해 걱정할 필요없이 올바른 코드를 만드십시오. 즉, 연결을 설정하거나 수신하고 해당 연결에서 100 또는 500 또는 임의의 수의 업데이트를 수행 한 다음 연결을 닫는 기능. 코드가 제대로 작동하면 timeit을 사용하는 방법에 대해 생각해보십시오.

    특히, 시간을 내고자하는 함수가 매개 변수가없는 foobar라고 불리우는 경우 timeit.timeit (2.6 이상 - 2.5 이전에는 더 복잡함)을 사용할 수 있습니다.

    timeit.timeit('foobar()', number=1000)
    

    기본 코드 인 백만 개가 사용 사례에 따라 높을 수 있으므로 실행 횟수를 지정하는 것이 좋습니다 (이 코드에서 많은 시간을 소비하게됩니다.).

  4. ==============================

    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. ==============================

    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")
    
  6. 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