我有一个Python命令行程序,需要一段时间才能完成。我想知道完成跑步所需的确切时间。

我看过timeit模块,但它似乎只适用于小代码片段。我想给整个节目计时。


当前回答

time.clock()

自3.3版起已弃用:此函数的行为取决于在平台上:改用perf_counter()或process_time(),这取决于您的需求,以具有定义良好的行为。

time.perf_counter()

返回性能计数器的值(以秒为单位),即具有最高可用分辨率的时钟来测量短路期间它包括睡眠期间的时间系统范围内。

time.process_time()

返回系统和当前进程的用户CPU时间。它不包括经过的时间在睡眠期间。

start = time.process_time()
... do something
elapsed = (time.process_time() - start)

其他回答

稍后回答,但我使用内置的timeit:

import timeit
code_to_test = """
a = range(100000)
b = []
for i in a:
    b.append(i*2)
"""
elapsed_time = timeit.timeit(code_to_test, number=500)
print(elapsed_time)
# 10.159821493085474

在code_to_test中包装所有代码,包括可能的任何导入。number参数指定代码应该重复的次数。演示

我将这个timing.py模块放入我自己的站点包目录中,并在模块顶部插入导入计时:

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。但仅包括导入计时就可以打印开始和结束时间,以及总运行时间。(请原谅我晦涩难懂的secondsToStr函数,它只是将浮点秒数设置为hh:mm:ss.sss格式。)

注意:上述代码的Python3版本可以在这里找到。

我尝试使用以下脚本找到时间差。

import time

start_time = time.perf_counter()
[main code here]
print (time.perf_counter() - start_time, "seconds")

Python程序执行度量的时间可能不一致,具体取决于:

可以使用不同的算法评估相同的程序运行时间因算法而异运行时间因实现而异运行时间因计算机而异基于小输入,运行时间不可预测

这是因为最有效的方法是使用“增长顺序”,并学习大“O”符号来正确地执行。

无论如何,您可以尝试使用以下简单算法来评估任何Python程序在每秒特定机器计数步骤中的性能:使其适应您想要评估的计划

import time

now = time.time()
future = now + 10
step = 4 # Why 4 steps? Because until here already four operations executed
while time.time() < future:
    step += 3 # Why 3 again? Because a while loop executes one comparison and one plus equal statement
step += 4 # Why 3 more? Because one comparison starting while when time is over plus the final assignment of step + 1 and print statement
print(str(int(step / 10)) + " steps per second")

如果您想以微秒为单位测量时间,那么可以使用以下版本,完全基于Paul McGuire和Nicojo的答案——这是Python 3代码。我还为它添加了一些颜色:

import atexit
from time import time
from datetime import timedelta, datetime


def seconds_to_str(elapsed=None):
    if elapsed is None:
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    else:
        return str(timedelta(seconds=elapsed))


def log(txt, elapsed=None):
    colour_cyan = '\033[36m'
    colour_reset = '\033[0;0;39m'
    colour_red = '\033[31m'
    print('\n ' + colour_cyan + '  [TIMING]> [' + seconds_to_str() + '] ----> ' + txt + '\n' + colour_reset)
    if elapsed:
        print("\n " + colour_red + " [TIMING]> Elapsed time ==> " + elapsed + "\n" + colour_reset)


def end_log():
    end = time()
    elapsed = end-start
    log("End Program", seconds_to_str(elapsed))


start = time()
atexit.register(end_log)
log("Start Program")

log()=>打印定时信息的函数。

txt==>要记录的第一个参数及其用于标记计时的字符串。

atexit==>Python模块,用于注册程序退出时可以调用的函数。