如何确定Python中的处理时间?

时间:2009-09-23 10:19:55

标签: python datetime

我是Python新手,对日期/时间文档感到困惑。我想计算执行计算所需的时间。

在java中,我会写:

long timeBefore = System.currentTimeMillis();
doStuff();
long timeAfter = System.currentTimeMillis();
elapsed time = timeAfter - timeBefore;

我确信它在Python中更容易。有人可以帮忙吗?

9 个答案:

答案 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