![](/img/trans.png)
[英]Python: Given the current time in UTC, how do you determine the start and end time of the day in a particular timezone?
[英]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)一個簡單的便攜式計時器將使用timeit
的default_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.