166

为了加速测试一段代码,在 Python 中比较 2 次的正确方法是什么?我尝试阅读 API 文档。我不确定我是否理解 timedelta 的事情。

到目前为止,我有这个代码:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here
4

16 回答 16

230

datetime.timedelta只是两个日期时间之间的差异......所以它就像一段时间,以天/秒/微秒为单位

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

请注意,c.microseconds仅返回 timedelta 的微秒部分!出于计时目的,请始终使用c.total_seconds().

您可以使用 datetime.timedelta 进行各种数学运算,例如:

>>> c / 10
datetime.timedelta(0, 0, 431654)

不过,查看 CPU 时间而不是挂钟时间可能更有用……尽管这取决于操作系统……在类 Unix 系统下,请查看“时间”命令。

于 2009-04-19T23:31:01.863 回答
78

从 Python 2.7 开始,就有了 timedelta.total_seconds() 方法。因此,要获得经过的毫秒数:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077
于 2014-06-17T22:38:54.230 回答
39

您可能想改用timeit 模块

于 2009-04-20T00:18:10.703 回答
26

我知道这已经很晚了,但我真的很喜欢使用:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()自纪元以来给你几秒钟。因为这是一个以秒为单位的标准化时间,您可以简单地从结束时间中减去开始时间来获得处理时间(以秒为单位)。time.clock()对基准测试很有用,但如果你想知道你的过程花了多长时间,我发现它有点没用。例如,说“我的进程需要 10 秒”比说“我的进程需要 10 个处理器时钟单元”更直观

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

在上面的第一个示例中, time.clock() 显示的时间为 0.05,而 time.time() 显示的时间为 0.06377

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

在第二个示例中,即使进程休眠了一秒钟,处理器时间也以某种方式显示为“0”。time.time()正确显示多于 1 秒。

于 2014-05-16T16:32:34.930 回答
24

您还可以使用:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

或者你可以使用python profilers

于 2009-04-19T23:38:06.387 回答
5

下面的代码应该显示时间detla ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart
于 2009-04-19T23:17:51.550 回答
4

您可以简单地打印差异:

print tend - tstart
于 2009-04-19T23:16:09.603 回答
4

我不是 Python 程序员,但我确实知道如何使用 Google,这就是我发现的:您使用“-”运算符。要完成您的代码:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

此外,您似乎可以使用 strftime() 函数来格式化时间跨度计算,以便渲染时间,但会让您感到高兴。

于 2009-04-19T23:17:18.870 回答
3

您可能需要查看配置文件模块。您将更好地了解减速的位置,并且您的大部分工作将完全自动化。

于 2009-04-19T23:41:17.423 回答
3

箭头:Python 更好的日期和时间

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
于 2020-02-12T14:35:27.453 回答
2

time.time() / datetime 适合快速使用,但并不总是 100% 精确。出于这个原因,我喜欢使用其中一个 std lib分析器(尤其是 hotshot)来找出什么是什么。

于 2009-04-19T23:19:26.400 回答
2

这是一个模仿 Matlab/Octave 函数的自定义tic toc函数。

使用示例:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

功能 :

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()
于 2016-10-20T17:54:51.573 回答
1

您需要time.time()改用它,它以高精度输出 unix 时间。

使用此代码:

from time import time

tstart = time()
doSomething()
tend = time()
difference = tend - tstart
print("The doSomething function took {} seconds to execute".format(difference))
于 2021-11-04T12:41:01.847 回答
0

您可以像这样使用 timeit 来测试名为 module.py 的脚本

$ python -mtimeit -s 'import module'
于 2012-09-27T08:41:52.347 回答
0
start = datetime.now() 

#code for which response time need to be measured.

end = datetime.now()
dif = end - start
dif_micro = dif.microseconds # time in microseconds
dif_millis = dif.microseconds / 1000 # time in millisseconds
于 2021-02-24T04:18:09.237 回答
0

如果有人需要这样的东西来分析日志条目之间的延迟,例如......等。

def get_time_diff_between_timestruct_tuples(timestruct_tuples):
    """
    expecting input like:
    [(0, datetime.datetime(2021, 10, 27, 16, 6, 8, 590892)),
    (1, datetime.datetime(2021, 10, 27, 16, 6, 8, 591833)),
    (2, datetime.datetime(2021, 10, 27, 16, 6, 9, 434053)),
    (3, datetime.datetime(2021, 10, 27, 16, 6, 9, 878021)), ...]
    
    output like:
    [0.941, 0.84222, 0.443968, ...]
    """
    
    def seconds_mms_diff(t0, t1):
        diff = t1 - t0
        s = diff.seconds
        mms = diff.microseconds
        return float(f"{s}.{mms}")
    
    timediffs = []
    init = timestruct_tuples[0][1]
    idx = 0
    while idx < (len(timestruct_tuples)-1):
        timediffs.append(seconds_mms_diff(init, timestruct_tuples[idx+1][1]))
        idx += 1
        init = timestruct_tuples[idx][1]
    return timediffs
于 2021-10-29T21:35:49.007 回答