Matlab의 tic 및 toc 함수에 해당하는 Python은 무엇입니까 ?
답변
timeit
ThiefMaster가 언급 한 것 외에도 간단한 방법은 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에서 사용자의 마우스 동작)을 프로파일 링하려고 할 때 유사한 기능에 대한 사용 사례 가 발생했습니다. 나는 소스에서 tic
s와 toc
s를 스팸으로 보내면서 대화 형으로 테스트하는 것이 병목 현상을 드러내는 가장 빠른 방법이 될 것이라고 생각했습니다. 나는 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())
이것은 스택의 시작 시간을 밀어서 작동하므로 여러 수준의 tic
s 및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
이 충실한 측정을 위해 필요합니다.
답변
tic
및 toc
에서 사용할 수 있습니다 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()
도움이되기를 바랍니다.