파이썬에 명령 행 프로그램이 있는데 완료하는 데 시간이 걸립니다. 달리는 데 걸리는 정확한 시간을 알고 싶습니다.
timeit
모듈을 살펴 보았지만 작은 코드 조각만을위한 것 같습니다. 전체 프로그램의 시간을 정하고 싶습니다.
답변
파이썬에서 가장 간단한 방법 :
import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))
이것은 프로그램을 실행하는 데 최소 10 분의 1 초가 걸린다고 가정합니다.
인쇄물:
--- 0.764891862869 seconds ---
답변
이 timing.py
모듈을 내 site-packages
디렉토리에 넣고 import timing
모듈 상단에 삽입 하십시오.
import atexit
from time import clock
def secondsToStr(t):
return "%d:%02d:%02d.%03d" % \
reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
[(t*1000,),1000,60,60])
line = "="*40
def log(s, elapsed=None):
print line
print secondsToStr(clock()), '-', s
if elapsed:
print "Elapsed time:", elapsed
print line
print
def endlog():
end = clock()
elapsed = end-start
log("End Program", secondsToStr(elapsed))
def now():
return secondsToStr(clock())
start = clock()
atexit.register(endlog)
log("Start Program")
내가 timing.log
보여주고 싶은 프로그램 내에 중요한 단계가 있다면 프로그램 내에서 전화 할 수도 있습니다 . 그러나 포함 import timing
하면 시작 및 종료 시간과 전체 경과 시간이 인쇄됩니다. ( secondsToStr
숨겨진 기능을 피하기 위해 부동 소수점 수를 hh : mm : ss.sss 형식으로 포맷합니다.)
답변
Linux 또는 Unix에서 :
$ time python yourprogram.py
Windows에서이 StackOverflow 질문 : Windows 명령 행에서 명령의 실행 시간을 어떻게 측정합니까?를 참조하십시오.
더 자세한 출력을 위해
$ time -v python yourprogram.py
Command being timed: "python3 yourprogram.py"
User time (seconds): 0.08
System time (seconds): 0.02
Percent of CPU this job got: 98%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.10
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 9480
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1114
Voluntary context switches: 0
Involuntary context switches: 22
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
답변
나는 Paul McGuire의 답변을 정말로 좋아 하지만 Python 3을 사용합니다. 따라서 관심있는 사람들을 위해 * nix의 Python 3에서 작동하는 그의 답변이 수정되었습니다 (Windows에서는 clock()
대신 대신 사용해야한다고 생각 합니다 time()
).
#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta
def secondsToStr(elapsed=None):
if elapsed is None:
return strftime("%Y-%m-%d %H:%M:%S", localtime())
else:
return str(timedelta(seconds=elapsed))
def log(s, elapsed=None):
line = "="*40
print(line)
print(secondsToStr(), '-', s)
if elapsed:
print("Elapsed time:", elapsed)
print(line)
print()
def endlog():
end = time()
elapsed = end-start
log("End Program", secondsToStr(elapsed))
start = time()
atexit.register(endlog)
log("Start Program")
이것이 유용하다는 것을 알게 되더라도, 대부분의 작업을했던 것처럼이 답변 대신 그의 답변을 계속 투표해야합니다.).
답변
import time
start_time = time.clock()
main()
print time.clock() - start_time, "seconds"
time.clock()
프로세서 시간을 반환하여이 프로세스에서 사용한 시간 만 계산할 수 있습니다 (어쨌든 Unix에서). 문서는 “어쨌든 이것은 파이썬 또는 타이밍 알고리즘 벤치마킹에 사용하는 기능”이라고 말합니다.
답변
나는 datetime
모듈이 제공 하는 출력을 좋아하는데 , 여기서 타임 델타 객체는 사람이 읽을 수있는 방식으로 필요한 일, 시간, 분 등을 보여줍니다.
예를 들면 다음과 같습니다.
from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))
샘플 출력 예
Duration: 0:00:08.309267
또는
Duration: 1 day, 1:51:24.269711
JF Sebastian이 언급 했듯이이 접근법은 현지 시간이 까다로운 몇 가지 사례가 발생할 수 있으므로 사용하는 것이 더 안전합니다.
import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))
답변
Python 프로파일 러 cProfile을 사용하여 CPU 시간 과 추가로 각 함수에 소요 된 시간 및 각 함수가 호출 된 횟수 를 측정 할 수 있습니다 . 시작 위치를 몰라도 스크립트 성능을 향상시키려는 경우 매우 유용합니다. 이 답변 다른 스택 오버플로 질문에 꽤 좋다. 문서 도 살펴 보는 것이 좋습니다 .
다음은 명령 행에서 cProfile을 사용하여 스크립트를 프로파일 링하는 방법의 예입니다.
$ python -m cProfile euler048.py
1007 function calls in 0.061 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.061 0.061 <string>:1(<module>)
1000 0.051 0.000 0.051 0.000 euler048.py:2(<lambda>)
1 0.005 0.005 0.061 0.061 euler048.py:2(<module>)
1 0.000 0.000 0.061 0.061 {execfile}
1 0.002 0.002 0.053 0.053 {map}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.003 0.003 0.003 0.003 {sum}
