[python] 파이썬 시간 측정 함수



Answers

timeit 모듈을 가지고 놀고 나면 인터페이스가 마음에 들지 않는다. 다음 두 가지 방법과 비교하면 너무 우아하지 않다.

다음 코드는 Python 3에 있습니다.

데코레이터 메소드

이것은 @ Mike의 방법과 거의 같습니다. 여기에 kwargsfunctools 추가하여 더 좋게 만듭니다.

def timeit(func):
    @functools.wraps(func)
    def newfunc(*args, **kwargs):
        startTime = time.time()
        func(*args, **kwargs)
        elapsedTime = time.time() - startTime
        print('function [{}] finished in {} ms'.format(
            func.__name__, int(elapsedTime * 1000)))
    return newfunc

@timeit
def foobar():
    mike = Person()
    mike.think(30)

컨텍스트 매니저 메소드

from contextlib import contextmanager

@contextmanager
def timeit_context(name):
    startTime = time.time()
    yield
    elapsedTime = time.time() - startTime
    print('[{}] finished in {} ms'.format(name, int(elapsedTime * 1000)))

예를 들어 다음과 같이 사용할 수 있습니다.

with timeit_context('My profiling code'):
    mike = Person()
    mike.think()

그리고 with 블록 내의 코드는 시간이 정해집니다.

결론

첫 번째 메소드를 사용하면 데코레이터를 정상적으로 주석 처리하여 정상 코드를 얻을 수 있습니다. 그러나 함수 시간 만 지정할 수 있습니다. 코드를 함수로 만들지 않는 코드가 있다면 두 번째 방법을 선택할 수 있습니다.

예를 들어

images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)

이제 bigImage = ... 행을 시간 bigImage = ... 하려고합니다. 함수로 변경하면 다음과 같이됩니다.

images = get_images()
bitImage = None
@timeit
def foobar():
    nonlocal bigImage
    bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)

nonlocal 키워드가없는 파이썬 2에 있다면 어떨까요?

대신, 두 번째 방법을 사용하면 다음과 같이 잘 맞습니다.

images = get_images()
with timeit_context('foobar'):
    bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Question

각 함수에 소요 된 시간을 테스트하고 그 이름으로 시간을 출력하는 파이썬 함수를 만들고 싶습니다. 어떻게 함수 이름을 출력 할 수 있습니까? 그렇게 할 수있는 다른 방법이 있다면 알려주십시오.

def measureTime(a):
    start = time.clock() 
    a()
    elapsed = time.clock()
    elapsed = elapsed - start
    print "Time spent in (function name) is: ", elapsed



데코레이터를 사용하는 데코레이터 메소드 Python 라이브러리 :

import decorator

@decorator
def timing(func, *args, **kwargs):
    '''Function timing wrapper
        Example of using:
        ``@timing()``
    '''

    fn = '%s.%s' % (func.__module__, func.__name__)

    timer = Timer()
    with timer:
        ret = func(*args, **kwargs)

    log.info(u'%s - %0.3f sec' % (fn, timer.duration_in_seconds()))
    return ret

내 블로그의 게시물보기 :

mobilepro.pl 블로그에 게시

Google 플러스 내 게시물




Timeit에는 두 가지 큰 결점이 있습니다. 즉, 함수의 반환 값을 반환하지 않으며 eval을 사용합니다.이 경우 수입을 위해 별도의 설치 코드를 전달해야합니다. 이렇게하면 두 가지 문제를 간단하고 우아하게 해결할 수 있습니다.

def timed(f):
  start = time.time()
  ret = f()
  elapsed = time.time() - start
  return ret, elapsed

timed(lambda: database.foo.execute('select count(*) from source.apachelog'))
(<sqlalchemy.engine.result.ResultProxy object at 0x7fd6c20fc690>, 4.07547402381897)



그것을하는 나의 방법 :

from time import time

def printTime(start):
    end = time()
    duration = end - start
    if duration < 60:
        return "used: " + str(round(duration, 2)) + "s."
    else:
        mins = int(duration / 60)
        secs = round(duration % 60, 2)
        if mins < 60:
            return "used: " + str(mins) + "m " + str(secs) + "s."
        else:
            hours = int(duration / 3600)
            mins = mins % 60
            return "used: " + str(hours) + "h " + str(mins) + "m " + str(secs) + "s."

함수 / 루프를 실행하기 전에 변수를 start = time() 으로 설정하고 블록 바로 다음에 printTime(start) 을 설정하십시오.

당신은 대답을 얻었습니다.




Links