关于datetime:Python速度测试 – 时差 – 毫秒

Python speed testing - Time Difference - milliseconds

在python中比较2次以加速测试一段代码的正确方法是什么?我试着读API文档。我不确定我是否理解时间差。

到目前为止,我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
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


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

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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进行各种数学运算,例如:

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

不过,查看CPU时间而不是WallClock时间可能更有用…但这取决于操作系统…在类Unix系统下,检查"time"命令。


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

1
2
3
4
5
6
7
8
>>> 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


您可能需要使用timeit模块。


您还可以使用:

1
2
3
4
5
6
import time

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

或者可以使用python profiler。


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

1
2
3
4
5
6
import time
start = time.time()

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

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

time.time()为您提供了新纪元以来的秒数。因为这是一个以秒为单位的标准化时间,所以您可以简单地从结束时间中减去开始时间来获得处理时间(以秒为单位)。time.clock()是很好的基准,但我发现如果你想知道你的过程需要多长时间的话,这有点无用。例如,说"我的进程需要10秒"比说"我的进程需要10个处理器时钟单元"更直观。

1
2
3
4
5
6
>>> 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

1
2
3
4
>>> 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秒。


您可以简单地打印差异:

1
print tend - tstart


以下代码应显示时间细节…

1
2
3
4
5
6
7
8
from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

这里有一个自定义函数,它模拟了matlab/octave的tictoc函数。

使用实例:

1
2
3
4
5
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')

功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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()


您可能需要查看配置文件模块。你会更好地了解你的速度慢的地方,而且你的大部分工作都是自动化的。


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


我不是一个python程序员,但我知道如何使用google,我发现了以下几点:你使用的是"-"操作符。要完成代码:

1
2
3
4
5
6
7
8
from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

此外,看起来您可以使用strftime()函数来格式化时间跨度计算,以便呈现时间,但这会让您感到高兴。


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

1
$ python -mtimeit -s 'import module'