Python?timeit使用小結(jié)
假設(shè)您要測(cè)量代碼段的執(zhí)行時(shí)間。你是做什么?直到現(xiàn)在,我就像大多數(shù)人一樣會(huì)做以下事情:
# 導(dǎo)入時(shí)間 start_time = time.time() """某些代碼""" end_time = time.time() print(f“執(zhí)行時(shí)間為:{end_time-start_time}”)
現(xiàn)在說我們要比較兩個(gè)不同函數(shù)的執(zhí)行時(shí)間,然后:
# 導(dǎo)入時(shí)間 def function_1(*參數(shù)): #做一點(diǎn)事 #返回值 def function_2(*參數(shù)): #做一點(diǎn)事 #返回值 #衡量function_1花費(fèi)的時(shí)間 start_of_f1 = time.time() 值1 = function_1(*參數(shù)) end_of_f1 = time.time() print(f” function_1花費(fèi)的時(shí)間是:{start_of_f1-end_of_f1}”)#function_2所花費(fèi)的測(cè)量時(shí)間 start_of_f2 = time.time() 值2 = function_1(*參數(shù)) end_of_f2 = time.time()print(f” function_1花費(fèi)的時(shí)間是:{start_of_f2-end_of_f2}”)
這是大多數(shù)人衡量執(zhí)行時(shí)間并比較兩個(gè)功能的方式。
但是,如果必須測(cè)量非常小的代碼段所花費(fèi)的時(shí)間,則此方法無法產(chǎn)生準(zhǔn)確的結(jié)果。甚至在比較功能時(shí),操作系統(tǒng)中發(fā)生的所有其他進(jìn)程和任務(wù)都與time.time()實(shí)例混為一談。因此比較功能時(shí)不準(zhǔn)確。
為了解決這個(gè)問題,Python有一個(gè)timeit模塊,該模塊用于測(cè)量大小代碼段的執(zhí)行時(shí)間。在本文的此處,我們首先使用一些示例來了解python 中的timeit庫。
首先,讓我們看看文檔中提供的概述。
在Python中的timeit
該模塊提供了一種計(jì)時(shí)少量Python代碼的簡(jiǎn)單方法。它既具有命令行界面又具有可調(diào)用界面。它避免了許多用于測(cè)量執(zhí)行時(shí)間的常見陷阱。
這個(gè)模塊有一個(gè)函數(shù)timeit.timeit(stmt = pass,setup = pass,timer = <default timer>,number = 1000000)這個(gè)函數(shù)有四個(gè)參數(shù):
- stmt:要測(cè)量其執(zhí)行時(shí)間的代碼段。
- setup:執(zhí)行stmt之前要運(yùn)行的代碼。通常,它用于導(dǎo)入一些模塊或聲明一些必要的變量。通過示例將更加清楚。
- timer:這是默認(rèn)的timeit.Timer對(duì)象。它有一個(gè)合理的默認(rèn)值,因此我們不必做太多事情。
- number:指定將執(zhí)行stmt的次數(shù)。
它會(huì)回到執(zhí)行拍攝(秒)的時(shí)間語句,指定的數(shù)十倍。
讓我們看一些例子以更好地理解它。
導(dǎo)入時(shí)間
#此代碼在stmt之前僅執(zhí)行一次。 setup_code =“來自數(shù)學(xué)導(dǎo)入sqrt” #此代碼將按照參數(shù)'number'的指定執(zhí)行 stmt_code =“ sum(sqrt(x)for范圍(1,10000)中的x)” 迭代次數(shù)= 10000 時(shí)間= timeit.timeit(stmt = stmt_code,設(shè)置= setup_code,數(shù)量=迭代次數(shù)) 打印(時(shí)間) #17.9秒 #此輸出適用于代碼片段的10000個(gè)版本,而不是一個(gè)單獨(dú)的版本。 print(f“單次迭代的時(shí)間為{time / iterations”“)
我們所做的只是將代碼作為字符串傳遞,并指定迭代次數(shù)給timeit.timeit函數(shù)。
現(xiàn)在,讓我們看看一種使用該驚人庫來比較兩個(gè)函數(shù)的方法。
在此示例中,讓我們比較兩個(gè)排序函數(shù),一個(gè)是簡(jiǎn)單的冒泡排序,另一個(gè)是Python內(nèi)置的sorted()函數(shù)。在這里,我們還將看到另一個(gè)名為repeat()的timeit函數(shù)。
def bubble_sort(arr): 對(duì)于范圍內(nèi)的我(len(arr)): 對(duì)于范圍(0,len(arr)-i-1)中的j: 如果arr [j]> arr [j + 1]: arr [j],arr [j + 1] = arr [j +1],arr [j] 返回arr def make_random_array(): 來自隨機(jī)進(jìn)口randint 返回[randint(-100,100)表示范圍(20)中的i] test_array = make_random_array() ''' 由于我們要確保在同一數(shù)組上測(cè)試函數(shù),因此我們聲明一個(gè)數(shù)組 在這里,稍后將在compare_functions()中調(diào)用它。 ''' def compare_functions(): 導(dǎo)入時(shí)間 setup_code1 =“”“ 來自__main__ import bubble_sort 從__main__導(dǎo)入test_array “” setup_code2 =“”“ 從__main__導(dǎo)入test_array “” stmt_code1 =“ bubble_sort(test_array)” stmt_code2 =“ sorted(test_array)” times1 = timeit.repeat(stmt = stmt_code1,setup = setup_code1,number = 10000,repeat = 5) times2 = timeit.repeat(stmt = stmt_code2,setup = setup_code2,number = 10000,repeat = 5) print(f“氣泡排序所花費(fèi)的時(shí)間為{min(times1)}”) print(f“內(nèi)置排序所花費(fèi)的時(shí)間為{min(times2)}”) 如果__name__ ==“ __main__”: compare_functions() “” 氣泡排序花費(fèi)的時(shí)間是0.2646727000001192 內(nèi)置排序所花費(fèi)的時(shí)間是0.0031973000000107277 “”
在這里,輸出是列表times1和times2中的最小值。
在設(shè)置代碼中,來自__main__導(dǎo)入氣泡排序
from __main__ import arr 這將導(dǎo)入程序中已定義的bubble_sort函數(shù),并導(dǎo)入我們?cè)诔绦蛑邢惹奥暶鞯臄?shù)組“ test_array”。
這將確保兩個(gè)功能都在同一數(shù)組“ test_array”上進(jìn)行測(cè)試。
timeit.repeat()需要一個(gè)附加參數(shù),重復(fù)(默認(rèn)值= 5)。這將返回多次重復(fù)的代碼段的執(zhí)行時(shí)間列表。
正如預(yù)期的那樣,冒泡排序所花費(fèi)的時(shí)間比內(nèi)置的sorted()函數(shù)要多得多。
現(xiàn)在總結(jié),讓我們看看如何使用該庫中的命令行界面。
從命令行作為程序調(diào)用時(shí),使用以下形式:
python -m timeit [-n N] [-r N] [-u U] [-s S] [聲明...]
這里,
-n N,執(zhí)行“語句”的次數(shù)。
-r N,重復(fù)多少次
-ss,設(shè)置語句
-uu,計(jì)時(shí)器輸出單位(nano,micro,mil,sec)
一些示例如下:
$ python -m timeit -s'text =“樣本字符串”; char =“ g”''文本中的字符'
5000000次循環(huán),最好是5次:每個(gè)循環(huán)0.0877微秒
$ python -m timeit -s'text =“樣本字符串”; char =“ g”''text.find(char)'
1000000次循環(huán),最好5次:每個(gè)循環(huán)0.342微秒
這結(jié)束了timeit模塊的介紹。我試圖涵蓋所有需要知道的知識(shí),從現(xiàn)在開始開始使用此模塊。
這是該模塊的官方文檔。請(qǐng)看看它以了解有關(guān)此模塊的更多信息。我也鼓勵(lì)您在這里查看此模塊的源代碼。
到此這篇關(guān)于Python timeit使用小結(jié)的文章就介紹到這了,更多相關(guān)Python timeit內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解django實(shí)現(xiàn)自定義manage命令的擴(kuò)展
這篇文章主要介紹了django實(shí)現(xiàn)自定義manage命令的擴(kuò)展,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python按要求從多個(gè)txt文本中提取指定數(shù)據(jù)的代碼示例
本文給大家介紹了Python如何按要求從多個(gè)txt文本中提取指定數(shù)據(jù),遍歷文件夾并從中找到文件名稱符合我們需求的多個(gè).txt格式文本文件,文中有相關(guān)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能示例
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能,結(jié)合實(shí)例形式分析了Python基于socket構(gòu)建客戶端與服務(wù)器端通信相關(guān)操作技巧,需要的朋友可以參考下2018-01-01python爬蟲headers設(shè)置后無效的解決方法
這篇文章主要為大家詳細(xì)介紹了python爬蟲headers設(shè)置后無效的解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Python的Asyncore異步Socket模塊及實(shí)現(xiàn)端口轉(zhuǎn)發(fā)的例子
asyncore模塊是封裝過的處理socket事件的模塊,采用異步的處理方式,這里我們講來講解Python的Asyncore異步Socket模塊及實(shí)現(xiàn)端口轉(zhuǎn)發(fā)的例子,需要的朋友可以參考下2016-06-06Python3的urllib.parse常用函數(shù)小結(jié)(urlencode,quote,quote_plus,unquot
這篇文章主要介紹了Python3的urllib.parse常用函數(shù),結(jié)合實(shí)例形式分析了urlencode,quote,quote_plus,unquote,unquote_plus等函數(shù)的相關(guān)使用技巧,需要的朋友可以參考下2016-09-09