41

我只是想计时一段代码。伪代码如下所示:

start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."

这在 Python 中看起来如何?

更具体地说,我如何获得自午夜以来的滴答数(或者 Python 组织该时间)?

4

6 回答 6

34

在该time模块中,有两个计时功能:timeclocktime给你“墙”时间,如果这是你关心的。

但是,python文档clock应该用于基准测试。请注意,clock在不同的系统中表现不同:

  • 在 MS Windows 上,它使用 Win32 函数 QueryPerformanceCounter(),“分辨率通常优于微秒”。它没有特殊含义,它只是一个数字(它在您第一次调用clock进程时开始计数)。
    # 毫秒窗口
    t0=time.clock()
    做点什么()
    t= time.clock() - t0 # t 是经过的墙壁秒数(浮点数)
  • 在 *nix 上,clock报告 CPU 时间。现在,这是不同的,并且很可能是您想要的值,因为您的程序几乎不是唯一请求 CPU 时间的进程(即使您没有其他进程,内核也会不时使用 CPU 时间)。因此,这个数字通常小于墙上时间(即 time.time() - t0),在对代码进行基准测试时更有意义:
    # linux
    t0=time.clock()
    做点什么()
    t= time.clock() - t0 # t 是经过的 CPU 秒数(浮点数)

除此之外,timeit模块有一个Timer类,该类应该使用最适合从可用功能进行基准测试的方法。

¹ 除非线程碍事……</p>

² Python≥3.3:有time.perf_counter()time.process_time(). perf_counter正在被timeit模块使用。

于 2008-10-01T12:49:11.290 回答
31

您需要的是模块中的time()功能time

import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."

不过,您可以使用timeit模块获得更多选项。

于 2008-10-01T05:27:03.413 回答
5

这是我最近开始使用的解决方案:

class Timer:
    def __enter__(self):
        self.begin = now()

    def __exit__(self, type, value, traceback):
        print(format_delta(self.begin, now()))

你像这样使用它(你至少需要 Python 2.5):

with Timer():
    do_long_code()

当您的代码完成时,Timer 会自动打印出运行时间。甜的!如果我想在 Python 解释器中快速调整某些东西,这是最简单的方法。

这是“now”和“format_delta”的示例实现,尽管您可以随意使用您喜欢的时间和格式化方法。

import datetime

def now():
    return datetime.datetime.now()

# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms. 
def format_delta(start,end):

    # Time in microseconds
    one_day = 86400000000
    one_hour = 3600000000
    one_second = 1000000
    one_millisecond = 1000

    delta = end - start

    build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day

    days = 0
    while build_time_us > one_day:
        build_time_us -= one_day
        days += 1

    if days > 0:
        time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
    else:
        hours = 0
        while build_time_us > one_hour:
            build_time_us -= one_hour
            hours += 1
        if hours > 0:
            time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
        else:
            seconds = 0
            while build_time_us > one_second:
                build_time_us -= one_second
                seconds += 1
            if seconds > 0:
                time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
            else:
                ms = 0
                while build_time_us > one_millisecond:
                    build_time_us -= one_millisecond
                    ms += 1
                time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
    return time_str

如果您有首选的格式化方法,或者是否有更简单的方法来完成所有这些,请告诉我!

于 2012-11-09T01:05:48.867 回答
2
import datetime

start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds

从午夜开始:

import datetime

midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
于 2008-10-01T05:28:59.007 回答
2

python 中的time 模块使您可以访问 clock() 函数,该函数以秒为单位返回时间作为浮点数。

不同的系统将根据其内部时钟设置(每秒滴答声)具有不同的精度,但通常至少低于 20 毫秒,在某些情况下优于几微秒。

-亚当

于 2008-10-01T05:31:01.857 回答
0

如果您有许多要计时的语句,则可以使用以下内容:

class Ticker:
    def __init__(self):
        self.t = clock()

    def __call__(self):
        dt = clock() - self.t
        self.t = clock()
        return 1000 * dt

然后您的代码可能如下所示:

tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())

这样你就不需要t = time()在每个块之前和1000 * (time() - t)之后输入,同时仍然可以控制格式(尽管你也可以很容易地把它放进去Ticket)。

这是一个最小的收益,但我认为这很方便。

于 2016-02-27T20:51:06.233 回答