使用Time模块测量经过时间

381 投票
10 回答
545478 浏览
提问于 2025-04-16 03:36

在Python的时间模块中,可以测量经过的时间吗?如果可以,我该怎么做呢?

我需要这样做,是因为我想要在光标在某个控件上停留了一段时间后触发一个事件。

10 个回答

95

对于想要更好格式的用户,

import time
start_time = time.time()
# your script
elapsed_time = time.time() - start_time
time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

将会输出,持续2秒:

'00:00:02'

并且持续7分钟1秒:

'00:07:01'

请注意,使用gmtime时,最小的时间单位是秒。如果你需要微秒,可以考虑以下内容:

import datetime
start = datetime.datetime.now()
# some code
end = datetime.datetime.now()
elapsed = end - start
print(elapsed)
# or
print(elapsed.seconds,":",elapsed.microseconds) 

strftime 文档

98

time.time() 可以解决这个问题。

import time

start = time.time()
# run your code
end = time.time()

elapsed = end - start

你可以看看 这个 问题,但我觉得没必要。

560
start_time = time.time()
# your code
elapsed_time = time.time() - start_time

你还可以写一个简单的装饰器,来方便地测量不同函数的执行时间:

import time
from functools import wraps

PROF_DATA = {}

def profile(fn):
    @wraps(fn)
    def with_profiling(*args, **kwargs):
        start_time = time.time()

        ret = fn(*args, **kwargs)

        elapsed_time = time.time() - start_time

        if fn.__name__ not in PROF_DATA:
            PROF_DATA[fn.__name__] = [0, []]
        PROF_DATA[fn.__name__][0] += 1
        PROF_DATA[fn.__name__][1].append(elapsed_time)

        return ret

    return with_profiling

def print_prof_data():
    for fname, data in PROF_DATA.items():
        max_time = max(data[1])
        avg_time = sum(data[1]) / len(data[1])
        print "Function %s called %d times. " % (fname, data[0]),
        print 'Execution time max: %.3f, average: %.3f' % (max_time, avg_time)

def clear_prof_data():
    global PROF_DATA
    PROF_DATA = {}

用法:

@profile
def your_function(...):
    ...

你可以同时对多个函数进行性能分析。然后只需调用 print_prof_data() 来打印测量结果:

撰写回答