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 |
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 |
请注意,
您可以使用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) |
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",即使进程休眠了一秒钟。
您可以简单地打印差异:
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的
使用实例:
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' |