簡體   English   中英

如何確定Python中的處理時間?

[英]How do you determine a processing time in Python?

我是Python的新手,並且對日期/時間文檔感到困惑。 我想計算執行計算所需的時間。

在java中,我會寫:

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

我確信它在Python中更容易。 有人可以幫忙嗎?

python中的等價物是:

>>> import time
>>> tic = time.clock()
>>> toc = time.clock()
>>> toc - tic

如果您正在嘗試找到性能最佳的方法,那么您應該查看timeit

建立並更新一些早期的響應(謝謝:SilentGhost,nosklo,Ramkumar)一個簡單的便攜式計時器將使用timeitdefault_timer()

>>> import timeit
>>> tic=timeit.default_timer()
>>> # Do Stuff
>>> toc=timeit.default_timer()
>>> toc - tic #elapsed time in seconds

這將返回經過的掛鍾(實際)時間,而不是CPU時間。 並且如timeit文檔中所述,根據平台選擇最精確的可用實際計時器。

另外,從Python 3.3開始, time.perf_counter性能計數器也提供了相同的功能。 在3.3+以下timeit.default_timer()引用這個新計數器。

對於更精確/復雜的性能計算, timeit包括更復雜的調用,用於自動計時小代碼片段,包括在一組定義的重復上平均運行時間。

你可以實現兩個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

也可以看看:

對於Python 3.3及更高版本的time.process_time()非常好:

import time

t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t
python -m timeit -h

如果你想要的只是代碼中兩點之間的時間(似乎這就是你想要的)我已經編寫了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上找到

有關如何確定處理時間的一些進一步信息,以及一些方法的比較(本文的答案中已經提到的一些) - 具體來說,區別在於:

start = time.time()

與現在已過時( 從3.3開始,time.clock()已棄用

start = time.clock()

在這里看到關於Stackoverflow的另一篇文章:

Python - time.clock()與time.time() - 准確度?

如果沒有別的,這將是有效的:

start = time.time()

... do something

elapsed = (time.time() - start)

我還要求計算一些代碼行的處理時間。 所以我嘗試了批准的答案,我得到了這個警告。

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將從Python 3.8中 刪除time.clock() 您可以從問題#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起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM