我有一个Python命令行程序,需要一段时间才能完成。我想知道完成跑步所需的确切时间。
我看过timeit模块,但它似乎只适用于小代码片段。我想给整个节目计时。
我有一个Python命令行程序,需要一段时间才能完成。我想知道完成跑步所需的确切时间。
我看过timeit模块,但它似乎只适用于小代码片段。我想给整个节目计时。
当前回答
from time import time
start_time = time()
...
end_time = time()
time_taken = end_time - start_time # time_taken is in seconds
hours, rest = divmod(time_taken,3600)
minutes, seconds = divmod(rest, 60)
其他回答
我很喜欢保罗·麦奎尔的答案,但我使用的是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")
如果你觉得这很有用,你仍然应该投票给他的答案,而不是这一个,因为他做了大部分工作;)。
我看过timeit模块,但它似乎只适用于小代码片段。我想给整个节目计时。
$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"
它运行一次your_module.main()函数,并使用time.time()函数作为计时器打印经过的时间。
要在Python中模拟/usr/bin/time,请参阅带有/usr/bin/time:如何捕获计时信息但忽略所有其他输出?的Python子进程?。
要测量每个函数的CPU时间(例如,不要包括time.sleep()期间的时间),可以使用profile模块(Python 2上的cProfile):
$ python3 -mprofile your_module.py
如果您想使用与配置文件模块相同的计时器,可以将-p传递给上面的timeit命令。
请参见如何评测Python脚本?
我尝试使用以下脚本找到时间差。
import time
start_time = time.perf_counter()
[main code here]
print (time.perf_counter() - start_time, "seconds")
在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
我定义了以下Python装饰器:
def profile(fct):
def wrapper(*args, **kw):
start_time = time.time()
ret = fct(*args, **kw)
print("{} {} {} return {} in {} seconds".format(args[0].__class__.__name__,
args[0].__class__.__module__,
fct.__name__,
ret,
time.time() - start_time))
return ret
return wrapper
并将其用于函数或类/方法:
@profile
def main()
...