1. 使用裝飾器來衡量函數執行時間
天柱網站建設公司成都創新互聯公司,天柱網站設計制作,有大型網站制作公司豐富經驗。已為天柱上1000家提供企業網站建設服務。企業網站搭建\外貿網站制作要多少錢,請找那個售后服務好的天柱做網站的公司定做!
有一個簡單方法,那就是定義一個裝飾器來測量函數的執行時間,并輸出結果:
import time
from functoolsimport wraps
import random
def fn_timer(function):
@wraps(function)
def function_timer(*args, **kwargs):
? t0= time.time()
? result= function(*args, **kwargs)
? t1= time.time()
? print("Total time running %s: %s seconds" %
? ? ? (function.__name__, str(t1- t0))
)
? return result
return function_timer
@fn_timer
def random_sort(n):
return sorted([random.random() for i in range(n)])
if __name__== "__main__":
random_sort(2000000)
輸出:Total time running random_sort: 0.6598007678985596 seconds
使用方式的話,就是在要監控的函數定義上面加上 @fn_timer 就行了
或者
# 可監控程序運行時間
import time
import random
def clock(func):
def wrapper(*args, **kwargs):
? ? start_time= time.time()
? ? result= func(*args, **kwargs)
? ? end_time= time.time()
? ? print("共耗時: %s秒" % round(end_time- start_time, 5))
? ? return result
return wrapper
@clock
def random_sort(n):
return sorted([random.random() for i in range(n)])
if __name__== "__main__":
random_sort(2000000)
輸出結果:共耗時: 0.65634秒
2. 使用timeit模塊
另一種方法是使用timeit模塊,用來計算平均時間消耗。
執行下面的腳本可以運行該模塊。
這里的timing_functions是Python腳本文件名稱。
在輸出的末尾,可以看到以下結果:4?loops, best of?5:?2.08?sec per loop
這表示測試了4次,平均每次測試重復5次,最好的測試結果是2.08秒。
如果不指定測試或重復次數,默認值為10次測試,每次重復5次。
3. 使用Unix系統中的time命令
然而,裝飾器和timeit都是基于Python的。在外部環境測試Python時,unix time實用工具就非常有用。
運行time實用工具:
輸出結果為:
Total?time running random_sort:?1.3931210041?seconds
real?1.49
user?1.40
sys?0.08
第一行來自預定義的裝飾器,其他三行為:
real表示的是執行腳本的總時間
user表示的是執行腳本消耗的CPU時間。
sys表示的是執行內核函數消耗的時間。
注意:根據維基百科的定義,內核是一個計算機程序,用來管理軟件的輸入輸出,并將其翻譯成CPU和其他計算機中的電子設備能夠執行的數據處理指令。
因此,Real執行時間和User+Sys執行時間的差就是消耗在輸入/輸出和系統執行其他任務時消耗的時間。
4. 使用cProfile模塊
5. 使用line_profiler模塊
6. 使用memory_profiler模塊
7. 使用guppy包
python長時間運行 時間不準調整設置就可以。
這是因為,run 函數不是一瞬間就運行完成的。它運行也會消耗時間。
可以使用1秒作為deltatime。如果涉及到更精確的時間,則還是需要用time.time()來計算循環初始時間,然后在循環結尾計算中間的時間差來獲得更精準的deltatime。
使用time.time來統計函數的執行時間,程序只會執行一次,存在很大的隨機因素。
timtit包就可以重復執行函數多次,然后將多次執行結果取平均值。相比起來更優。
然而程序執行時間很大程度還受計算機性能的影響,衡量程序好壞更靠譜的手段是計算時間復雜度。
使用timeit模塊,先介紹下:
timeit 模塊
timeit?模塊定義了接受兩個參數的?Timer?類。兩個參數都是字符串。 第一個參數是你要計時的語句或者函數。 傳遞給?Timer?的第二個參數是為第一個參數語句構建環境的導入語句。 從內部講,?timeit?構建起一個獨立的虛擬環境, 手工地執行建立語句,然后手工地編譯和執行被計時語句。
一旦有了?Timer?對象,最簡單的事就是調用?timeit(),它接受一個參數為每個測試中調用被計時語句的次數,默認為一百萬次;返回所耗費的秒數。
Timer?對象的另一個主要方法是?repeat(), 它接受兩個可選參數。 第一個參數是重復整個測試的次數,第二個參數是每個測試中調用被計時語句的次數。 兩個參數都是可選的,它們的默認值分別是?3?和?1000000。?repeat()?方法返回以秒記錄的每個測試循環的耗時列表。Python?有一個方便的?min?函數可以把輸入的列表返回成最小值,如: min(t.repeat(3, 1000000))
你可以在命令行使用?timeit?模塊來測試一個已存在的?Python?程序,而不需要修改代碼。
再給你個例子,你就知道怎么做了。
#?-*-?coding:?utf-8?-*-
#!/bin/env?python
def?test1():
n=0
for?i?in?range(101):
n+=i
return?n
def?test2():
return?sum(range(101))
def?test3():
return?sum(x?for?x?in?range(101))
if?__name__=='__main__':
from?timeit?import?Timer
t1=Timer("test1()","from?__main__?import?test1")
t2=Timer("test2()","from?__main__?import?test2")
t3=Timer("test3()","from?__main__?import?test3")
print?t1.timeit(1000000)
print?t2.timeit(1000000)
print?t3.timeit(1000000)
print?t1.repeat(3,1000000)
print?t2.repeat(3,1000000)
print?t3.repeat(3,1000000)
time.sleep() 函數命名來源于英文單詞time(時間)和sleep(睡眠)。
time 是python帶的非內置庫,使用時需要import,主要用于處理和時間相關的操作。
time.sleep用于給定時間內掛起(等待)當前線程的執行。
time.sleep() 函數的例子:
可以注釋掉time.sleep(2)再運行一次對比一下
可以看到雖然都是打印出一樣的結果,但time.sleep()加入了等待時間
這里還要解釋一下python中線程與進程的區別。
舉個例子,廚房做菜看成是一個進程,那么這個進程下面就可能有多個人或一個人(cpu基本執行單元,即線程)來執行,多個人可以分別洗菜,刷碗,擺盤等等同時作業,他們又是共享這個廚房的資源的。每個人存在一定的資源競爭關系,比如爐火只有1個。
這里time.sleep是針對線程執行的,也就是其中一個人去sleep睡覺了,不影響其他人的繼續工作。
參數
該函數沒有返回值。
結果類似如下:
可以看到秒數相差了5
無
time.sleep()常用于推遲執行的場景
在python中,與時間相關的模塊有:time,datetime以及calendar
對基礎運行環境有疑問的,推薦參考: python函數深入淺出 0.基礎篇
最簡單的:\x0d\x0a寫一個python腳本\x0d\x0a加一個死循環,判斷時間。\x0d\x0a如果到了指定的時間,就運行一次,然后在進入死循環。\x0d\x0a當然不是要你真搞個死循環占用CPU,你可以用sleep函數。不占用CPU。\x0d\x0a每次sleep 10s。。\x0d\x0a加個啟動項,每次開機啟動這個腳本就行了。
本文題目:python函數執行時間的簡單介紹
瀏覽地址:http://vcdvsql.cn/article20/hehsjo.html
成都網站建設公司_創新互聯,為您提供網站營銷、品牌網站建設、定制網站、搜索引擎優化、電子商務、網站設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯