在 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
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
仅返回时间增量的微秒部分!出于计时目的,请始终使用 c.total_seconds()
。
您可以使用 datetime.timedelta 进行各种数学计算,例如:
>>> c / 10
datetime.timedelta(0, 0, 431654)
查看 CPU 时间而不是挂钟时间可能更有用...不过这取决于操作系统...在类 Unix 系统下,请查看“time”命令。
自 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
您可能想使用 timeit 模块。
我知道这已经晚了,但我实际上很喜欢使用:
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 秒。
您还可以使用:
import time
start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)
或者您可以使用 python 分析器。
以下代码应显示时间延迟...
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
您可以简单地打印差异:
print tend - tstart
您可能想查看个人资料模块。您将更好地了解速度变慢的地方,并且您的大部分工作将完全自动化。
我不是Python程序员,但是我知道如何使用Google,这就是我发现的:你使用“-”运算符。要完成您的代码:
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
此外,看起来您可以使用 strftime() 函数来格式化时间跨度计算以呈现时间,但这会让您感到高兴。
箭头: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
您需要使用
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))
time.time() / datetime 适合快速使用,但并不总是 100% 精确。出于这个原因,我喜欢使用 std lib profilers 之一(尤其是 hotshot)来找出是什么。
这是一个模仿 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()
您可以像这样使用 timeit 来测试名为 module.py 的脚本
$ python -mtimeit -s 'import module'
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
如果有人需要这样的东西来分析日志条目之间的延迟,例如......等。
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