[python] Matlab의 tic 및 toc 함수에 해당하는 Python은 무엇입니까?

Matlab의 tic 및 toc 함수에 해당하는 Python은 무엇입니까 ?



답변

timeitThiefMaster가 언급 한 것 외에도 간단한 방법은 time다음과 같습니다 (를 가져온 후 ).

t = time.time()
# do stuff
elapsed = time.time() - t

사용하고 싶은 도우미 클래스가 있습니다.

class Timer(object):
    def __init__(self, name=None):
        self.name = name

    def __enter__(self):
        self.tstart = time.time()

    def __exit__(self, type, value, traceback):
        if self.name:
            print('[%s]' % self.name,)
        print('Elapsed: %s' % (time.time() - self.tstart))

컨텍스트 관리자로 사용할 수 있습니다.

with Timer('foo_stuff'):
   # do some foo
   # do some stuff

때로는이 기술이보다 편리하다고 timeit생각합니다. 측정하려는 항목에 따라 다릅니다.


답변

Matlab에서 Python으로 마이그레이션했을 때도 같은 질문이있었습니다. 이 스레드의 도움으로 Matlab 과 함수 의 정확한 아날로그 를 구성 할 수있었습니다 . 스크립트 상단에 다음 코드를 삽입하기 만하면됩니다.tic()toc()

import time

def TicTocGenerator():
    # Generator that returns time differences
    ti = 0           # initial time
    tf = time.time() # final time
    while True:
        ti = tf
        tf = time.time()
        yield tf-ti # returns the time difference

TicToc = TicTocGenerator() # create an instance of the TicTocGen generator

# This will be the main function through which we define both tic() and toc()
def toc(tempBool=True):
    # Prints the time difference yielded by generator instance TicToc
    tempTimeInterval = next(TicToc)
    if tempBool:
        print( "Elapsed time: %f seconds.\n" %tempTimeInterval )

def tic():
    # Records a time in TicToc, marks the beginning of a time interval
    toc(False)

그게 다야! 이제 Matlab에서 tic()toc()마찬가지로 완전히 사용할 준비가되었습니다 . 예를 들면

tic()

time.sleep(5)

toc() # returns "Elapsed time: 5.00 seconds."

실제로 이것은 내장 된 Matlab 함수보다 더 다양합니다. 여기에서의 다른 인스턴스를 만들어 TicTocGenerator여러 작업을 추적하거나 시간을 다르게 지정할 수 있습니다 . 예를 들어, 스크립트의 타이밍을 정하는 동안 이제 스크립트의 각 부분과 전체 스크립트의 타이밍을 개별적으로 지정할 수 있습니다. (구체적인 예를 제공하겠습니다)

TicToc2 = TicTocGenerator() # create another instance of the TicTocGen generator

def toc2(tempBool=True):
    # Prints the time difference yielded by generator instance TicToc2
    tempTimeInterval = next(TicToc2)
    if tempBool:
    print( "Elapsed time 2: %f seconds.\n" %tempTimeInterval )

def tic2():
    # Records a time in TicToc2, marks the beginning of a time interval
    toc2(False)

이제 두 개의 개별적인 시간을 측정 할 수 있습니다. 다음 예에서는 전체 스크립트와 스크립트의 일부를 개별적으로 시간을 측정합니다.

tic()

time.sleep(5)

tic2()

time.sleep(3)

toc2() # returns "Elapsed time 2: 5.00 seconds."

toc() # returns "Elapsed time: 8.00 seconds."

실제로 tic()매번 사용할 필요조차 없습니다 . 시간을 측정하려는 일련의 명령이 있으면 다음과 같이 작성할 수 있습니다.

tic()

time.sleep(1)

toc() # returns "Elapsed time: 1.00 seconds."

time.sleep(2)

toc() # returns "Elapsed time: 2.00 seconds."

time.sleep(3)

toc() # returns "Elapsed time: 3.00 seconds."

# and so on...

도움이 되었기를 바랍니다.


답변

tic과 toc의 가장 좋은 유사점은 단순히 파이썬으로 정의하는 것입니다.

def tic():
    #Homemade version of matlab tic and toc functions
    import time
    global startTime_for_tictoc
    startTime_for_tictoc = time.time()

def toc():
    import time
    if 'startTime_for_tictoc' in globals():
        print "Elapsed time is " + str(time.time() - startTime_for_tictoc) + " seconds."
    else:
        print "Toc: start time not set"

그런 다음 다음과 같이 사용할 수 있습니다.

tic()
# do stuff
toc()


답변

일반적으로, IPython의는 %time, %timeit, %prun%lprun(한 경우 line_profiler설치) 아주 잘 내 프로파일 요구를 충족. 그러나 tic-toc대화식으로 구동되는 계산 (예 : GUI에서 사용자의 마우스 동작)을 프로파일 링하려고 할 때 유사한 기능에 대한 사용 사례 가 발생했습니다. 나는 소스에서 tics와 tocs를 스팸으로 보내면서 대화 형으로 테스트하는 것이 병목 현상을 드러내는 가장 빠른 방법이 될 것이라고 생각했습니다. 나는 Eli Bendersky의 Timer수업을 들었지만, 일부 편집자들에게는 불편할 수 있고 버전 관리 시스템을 혼동 할 수있는 내 코드의 들여 쓰기를 변경해야했기 때문에 완전히 행복하지 않았습니다. 또한 다른 기능의 포인트 사이의 시간을 측정해야 할 수도 있습니다.with성명서. 많은 Python 영리함을 시도한 후 가장 잘 작동하는 간단한 솔루션은 다음과 같습니다.

from time import time
_tstart_stack = []

def tic():
    _tstart_stack.append(time())

def toc(fmt="Elapsed: %s s"):
    print fmt % (time() - _tstart_stack.pop())

이것은 스택의 시작 시간을 밀어서 작동하므로 여러 수준의 tics 및toc s에 . 또한이 toc명령문 의 형식 문자열을 변경하여 추가 정보를 표시 할 수 있습니다. 저는 Eli의 Timer클래스 에 대해 좋아했습니다 .

어떤 이유로 순수한 Python 구현의 오버 헤드에 관심이 있었으므로 C 확장 모듈도 테스트했습니다.

#include <Python.h>
#include <mach/mach_time.h>
#define MAXDEPTH 100

uint64_t start[MAXDEPTH];
int lvl=0;

static PyObject* tic(PyObject *self, PyObject *args) {
    start[lvl++] = mach_absolute_time();
    Py_RETURN_NONE;
}

static PyObject* toc(PyObject *self, PyObject *args) {
return PyFloat_FromDouble(
        (double)(mach_absolute_time() - start[--lvl]) / 1000000000L);
}

static PyObject* res(PyObject *self, PyObject *args) {
    return tic(NULL, NULL), toc(NULL, NULL);
}

static PyMethodDef methods[] = {
    {"tic", tic, METH_NOARGS, "Start timer"},
    {"toc", toc, METH_NOARGS, "Stop timer"},
    {"res", res, METH_NOARGS, "Test timer resolution"},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
inittictoc(void) {
    Py_InitModule("tictoc", methods);
}

이것은 MacOSX 용이며 확인하기 위해 코드를 생략했습니다. lvl 용이며 간결성을 위해 범위를 벗어 났는지 생략했습니다. tictoc.res()내 시스템에서 약 50 나노초의 해상도를 산출하는 동안 모든 Python 명령문을 측정 할 때 발생하는 지터가 마이크로 초 범위 (IPython에서 사용할 경우 훨씬 더 많음)에 쉽게 있음을 발견했습니다. 이 시점에서 Python 구현의 오버 헤드는 무시할 수 있으므로 C 구현과 동일한 신뢰도로 사용할 수 있습니다.

나는- tic-toc접근법 의 유용성 이 실행하는 데 10 마이크로 초 이상 걸리는 코드 블록으로 제한 된다는 사실을 발견했습니다 . 그 아래에서는 in과 같은 평균화 전략 timeit이 충실한 측정을 위해 필요합니다.


답변

tictoc에서 사용할 수 있습니다 ttictoc. 함께 설치

pip install ttictoc

다음과 같이 스크립트로 가져옵니다.

from ttictoc import tic,toc
tic()
# Some code
print(toc())


답변

Matlab이하는 일인 중첩 된 tic tocs를 달성하기 위해 모듈 [tictoc.py]을 만들었습니다.

from time import time

tics = []

def tic():
    tics.append(time())

def toc():
    if len(tics)==0:
        return None
    else:
        return time()-tics.pop()

그리고 다음과 같이 작동합니다.

from tictoc import tic, toc

# This keeps track of the whole process
tic()

# Timing a small portion of code (maybe a loop)
tic()

# -- Nested code here --

# End
toc()  # This returns the elapse time (in seconds) since the last invocation of tic()
toc()  # This does the same for the first tic()

도움이되기를 바랍니다.


답변

timeit모듈을 살펴보십시오 . 실제로는 동일하지는 않지만 시간을 측정하려는 코드가 함수 내에 있으면 쉽게 사용할 수 있습니다.