我是Python新手,对日期/时间文档感到困惑。我想计算执行计算所需的时间。
在java中,我会写:
long timeBefore = System.currentTimeMillis();
doStuff();
long timeAfter = System.currentTimeMillis();
elapsed time = timeAfter - timeBefore;
我确信它在Python中更容易。有人可以帮忙吗?
答案 0 :(得分:60)
python中的等价物是:
>>> import time
>>> tic = time.clock()
>>> toc = time.clock()
>>> toc - tic
如果您正在尝试找到性能最佳的方法,那么您应该查看timeit
。
答案 1 :(得分:25)
建立并更新一些早期的回复(谢谢:SilentGhost,nosklo,Ramkumar)一个简单的便携式计时器将使用timeit
的{{1}}:
default_timer()
这将返回经过的挂钟(实际)时间,而不是CPU时间。并且如timeit
documentation中所述,根据平台选择最精确的可用现实世界计时器。
另外,从Python 3.3开始,time.perf_counter
性能计数器可以使用相同的功能。在3.3+以下timeit.default_timer()指的是这个新的计数器。
对于更精确/复杂的性能计算,>>> import timeit
>>> tic=timeit.default_timer()
>>> # Do Stuff
>>> toc=timeit.default_timer()
>>> toc - tic #elapsed time in seconds
包括更复杂的调用,用于自动计时小代码片段,包括在一组定义的重复上平均运行时间。
答案 2 :(得分:7)
答案 3 :(得分:6)
您可以实现两个tic()
和tac()
个函数,其中tic()
捕获调用它的时间,tac()
打印自tic()
以来的时差被称为。这是一个简短的实现:
import time
_start_time = time.time()
def tic():
global _start_time
_start_time = time.time()
def tac():
t_sec = round(time.time() - _start_time)
(t_min, t_sec) = divmod(t_sec,60)
(t_hour,t_min) = divmod(t_min,60)
print('Time passed: {}hour:{}min:{}sec'.format(t_hour,t_min,t_sec))
现在,在您的代码中,您可以将其用作:
tic()
do_some_stuff()
tac()
例如,它将输出:
Time passed: 0hour:7min:26sec
答案 4 :(得分:6)
对于Python 3.3及更高版本time.process_time()
非常好:
import time
t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t
答案 5 :(得分:1)
python -m timeit -h
答案 6 :(得分:1)
如果你想要的只是代码中两点之间的时间(看起来这就是你想要的)我已经写了tic()
toc()
函数ala Matlab的实现。基本用例是:
tic()
''' some code that runs for an interesting amount of time '''
toc()
# OUTPUT:
# Elapsed time is: 32.42123 seconds
超级,非常容易使用,一种即发即弃的代码。它可以在Github的Gist https://gist.github.com/tyleha/5174230
上找到答案 7 :(得分:1)
关于如何确定处理时间的一些进一步信息,以及几种方法的比较(本文的答案中已经提到的一些) - 具体来说,区别:
start = time.time()
与现在过时的(as of 3.3, time.clock() is deprecated)
start = time.clock()
在这里看到关于Stackoverflow的另一篇文章:
Python - time.clock() vs. time.time() - accuracy?
如果没有别的,这将有效:
start = time.time()
... do something
elapsed = (time.time() - start)
答案 8 :(得分:0)
我还需要计算一些代码行的处理时间。所以我尝试了批准的答案,然后得到了这个警告。
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
因此python将remove time.clock()中的Python 3.8。您可以在问题#13270中看到更多有关它的信息。此警告建议使用两个功能,而不是time.clock()。在文档中的time.clock()部分中还详细介绍了此警告。
从3.3版开始不推荐使用,将在3.8版中删除:此功能的行为取决于平台:根据需要,使用perf_counter()或process_time()来具有明确定义的行为。
让我们详细了解这两个功能。
返回性能计数器的值(以秒为单位),即具有最高可用分辨率的时钟以测量短时间。它的确包含整个系统的睡眠时间。返回值的参考点是不确定的,因此仅连续调用的结果之间的差有效。
3.3版中的新功能。
因此,如果您希望将其用作nanoseconds
,则可以使用time.perf_counter_ns(),并且如果您的代码包含time.sleep(secs),它也将计数。例如:-
import time
def func(x):
time.sleep(5)
return x * x
lst = [1, 2, 3]
tic = time.perf_counter()
print([func(x) for x in lst])
toc = time.perf_counter()
print(toc - tic)
# [1, 4, 9]
# 15.0041916 --> output including 5 seconds sleep time
返回当前进程的系统和用户CPU时间之和的值(以秒为单位)。它不包括睡眠期间经过的时间。根据定义,它是整个过程的。返回值的参考点是不确定的,因此仅连续调用的结果之间的差有效。
3.3版中的新功能。
因此,如果您希望将其用作nanoseconds
,则可以使用time.process_time_ns(),并且如果您的代码包含time.sleep(secs),则它不会计数。例如:-
import time
def func(x):
time.sleep(5)
return x * x
lst = [1, 2, 3]
tic = time.process_time()
print([func(x) for x in lst])
toc = time.process_time()
print(toc - tic)
# [1, 4, 9]
# 0.0 --> output excluding 5 seconds sleep time
请注意time.perf_counter_ns()和time.process_time_ns()都提出了Python 3.7。