电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python timeit模塊原理及使用方法

瀏覽:4日期:2022-07-08 17:29:39

Python 中的 timeit 模塊可以用來測試一段代碼的執行耗時,如一個變量賦值語句的執行時間,一個函數的運行時間等。

timeit 模塊是 Python 標準庫中的模塊,無需安裝,直接導入就可以使用。導入時直接 import timeit ,可以使用 timeit() 函數和 repeat() 函數,還有 Timer 類。使用 from timeit import ... 時,只能導入 Timer 類(有全局變量 __all__ 限制)。

timeit 模塊的源碼總共只有 300 多行,主要就是實現上面的兩個函數和一個類,可以自己看一下。

接下來就開始使用 timeit 模塊來測試代碼執行時間,我使用 timeit 模塊來對比 Python 列表從頭部添加數據和從尾部添加數據的執行時間(測試什么根據需求來定)。

一、使用 timeit() 函數測試運行時間

1. 準備測試函數

先寫兩個函數,一個函數是從列表頭部添加數據,另一個函數是從列表尾部添加數據。

#coding = utf - 8def insert_time_test(): insert_list = list()for i in range(10): insert_list.insert(0, i)def append_time_test(): append_list = list()for i in range(10): append_list.append(i)if __name__ == ’__main__’: import timeit# coding = utf - 8def insert_time_test(): insert_list = list()for i in range(10): insert_list.insert(0, i)def append_time_test(): append_list = list()for i in range(10): append_list.append(i)if __name__ == ’__main__’: import timeit

2. timeit(stmt='pass', setup='pass', timer=default_timer, number=default_number) 函數介紹

timeit() 函數有四個參數,每個參數都是關鍵字參數,都有默認值。

stmt:傳入需要測試時間的代碼,可以直接傳入代碼表達式或單個變量,也可以傳入函數。傳入函數時要在函數名后面加上小括號,讓函數執行,如 stmt = ‘func()’ 。

setup:傳入 stmt 的運行環境,如 stmt 中使用到的參數、變量,要導入的模塊等,如 setup = ‘from __main__ import func’ (__main__表示當前的文件)。可以寫一行語句,也可以寫多行語句,寫多行語句時用分號隔開。

stmt 參數和 setup 參數默認值都是 pass,如果不傳值,那么就失去了測試的意義,所以這兩個參數是必要的。

timer: timer 參數是當前操作系統的基本時間單位,默認會根據當前運行環境的操作系統自動獲取(源碼中已經定義),保持默認即可。

number:要測試的代碼的運行次數,默認1000000(一百萬)次,對于耗時的代碼,運行太多次會花很多時間,可以自己修改運行次數。

3. 測試函數的運行時間

現在使用 timeit() 來測試上面兩個函數的運行時間。

insert_time_timeit = timeit.timeit(stmt=’insert_time_test()’,setup=’from __main__ import insert_time_test’)print(’insert_time_timeit: ’, insert_time_timeit)append_time_timeit = timeit.timeit(stmt=’append_time_test()’,setup=’from __main__ import append_time_test’)print(’append_time_timeit: ’, append_time_timeit)

運行結果:

(’insert_time_timeit: ’, 2.9112871)(’append_time_timeit: ’, 1.8884124999999998)

可以看到,在列表頭部添加數據的時間比在列表尾部添加數據的時間長。

4. 測試代碼(表達式)的運行時間

繼續使用 timeit() 測試上面代碼的運行時間,只是這次是直接將代碼傳入到參數中,而不是傳入函數。

insert_time_timeit = timeit.timeit(stmt=’list(insert_list.insert(0, i) for i in init_list)’,setup=’insert_list=list();init_list=range(10)’,number=100000)print(’insert_time_timeit: ’, insert_time_timeit)append_time_timeit = timeit.timeit(stmt=’list(append_list.append(i) for i in init_list)’,setup=’append_list=list();init_list=range(10)’,number=100000)print(’append_time_timeit: ’, append_time_timeit)

由于時間很長,代碼中特意將 number 從一百萬次改成了十萬次。運行結果如下:

(’insert_time_timeit: ’, 330.46189400000003)(’append_time_timeit: ’, 0.21436310000001413)

相對來說,對于相同的操作,使用函數的運行時間遠小于直接傳入代碼表達式的時間,頭部插入數據的尤其明顯。

二、使用 repeat() 函數測試運行時間

1. repeat(stmt='pass', setup='pass', timer=default_timer, repeat=default_repeat, number=default_number) 函數介紹

repeat() 函數有五個參數,每個參數都是關鍵字參數,都有默認值。相比 timeit() 函數而言,timeit() 函數有的參數 repeat() 函數都有,此外,repeat() 函數多了一個 repeat 參數。

repeat:表示測試要重復幾次,可以理解為將相同參數的 timeit() 函數重復執行。最終的結果構成一個列表返回,repeat 默認為3次。

2. 測試函數的運行時間

現在使用 repeat() 來測試上面兩個函數的運行時間。

insert_time_repeat = timeit.repeat(stmt=’insert_time_test()’,setup=’from __main__ import insert_time_test’)print(’insert_time_repeat: ’, insert_time_repeat)append_time_repeat = timeit.repeat(stmt=’append_time_test()’,setup=’from __main__ import append_time_test’)print(’append_time_repeat: ’, append_time_repeat)

運行結果如下:

(’insert_time_repeat: ’, [2.7707739, 2.908885, 2.7164823999999994])(’append_time_repeat: ’, [1.7458063, 1.777368000000001, 1.8675014999999995])

3. 測試代碼(表達式)的運行時間

繼續使用 repeat() 測試上面代碼的運行時間,直接傳入代碼,上面將 number 改成十萬次后,時間還是很長(300多秒),所以繼續減小 number ,改成一萬次。

insert_time_repeat = timeit.repeat(stmt=’list(insert_list.insert(0, i) for i in init_list)’,setup=’insert_list=list();init_list=range(10)’,repeat=5,number=10000)print(’insert_time_repeat: ’, insert_time_repeat)append_time_repeat = timeit.repeat(stmt=’list(append_list.append(i) for i in init_list)’,setup=’append_list=list();init_list=range(10)’,repeat=5,number=10000)print(’append_time_repeat: ’, append_time_repeat)

運行結果如下:

(’insert_time_repeat: ’, [2.591015, 2.5814996999999997, 2.5547322, 2.6153070000000005, 2.5496864000000006])(’append_time_repeat: ’, [0.0181692999999985, 0.01746889999999901, 0.018901899999999472, 0.018737400000000903, 0.018211900000000725])

三、使用 Timer 類測試運行時間

1. Timer 類介紹

上面使用了 timeit() 函數和 repeat() 函數,其實在 timeit 模塊中,這兩個函數都是對 Timer 類做了進一步的封裝,實際調用的還是 Timer 類中的方法。

在 Timer 類中,實現了兩個方法,timeit() 方法和 repeat() 方法,上面兩個函數調用的就是這兩個方法。

在使用 from timeit import ... 時,只能導入 Timer 類,所以可以直接使用 Timer 類來測試,可以自己去調用方法,使用起來更靈活。

2. 測試列表頭部添加

先實例化一個 Timer 類的對象,實例化時傳入 stmt 和 setup 參數(參數的含義與上面一致),timer 參數保持默認,然后通過實例對象調用對應的 timeit() 方法或 repeat() 方法,在 timeit() 方法中傳入 number,在repeat() 方法中傳入 number 和 repeat 。

使用 timeit() 方法和 repeat() 方法測試從頭部添加數據的運行時間。

timer_insert = timeit.Timer(stmt=’insert_time_test()’, setup=’from __main__ import insert_time_test’)insert_time_timeit = timer_insert.timeit(number=1000000)print(’insert_time_timeit: ’, insert_time_timeit)insert_time_repeat = timer_insert.repeat(number=1000000)print(’insert_time_repeat: ’, insert_time_repeat)

運行結果如下:

(’insert_time_timeit: ’, 2.7732486)(’insert_time_repeat: ’, [2.7367806999999997, 2.707402600000001, 2.7288245999999994])

3. 測試列表尾部添加

使用 timeit() 方法和 repeat() 方法測試從尾部添加數據的運行時間。

timer_append = timeit.Timer(stmt=’append_time_test()’, setup=’from __main__ import append_time_test’)append_time_timeit = timer_append.timeit(number=1000000)print(’append_time_timeit: ’, append_time_timeit)append_time_repeat = timer_append.repeat(number=1000000)print(’append_time_repeat: ’, append_time_repeat)

運行結果如下:

(’append_time_timeit: ’, 1.9966106000000001)(’append_time_repeat: ’, [1.9523343999999998, 1.8373857999999998, 1.8695377000000004])

timeit 模塊是一個比較簡單的模塊,大概用法就這些了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 焊锡丝|焊锡条|无铅锡条|无铅锡丝|无铅焊锡线|低温锡膏-深圳市川崎锡业科技有限公司 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 四川成都干燥设备_回转筒干燥机_脉冲除尘器_输送设备_热风炉_成都川工星科机电设备有限公司 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 恒温恒湿试验箱_高低温试验箱_恒温恒湿箱-东莞市高天试验设备有限公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 广东西屋电气有限公司-广东西屋电气有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 涡街流量计_LUGB智能管道式高温防爆蒸汽温压补偿计量表-江苏凯铭仪表有限公司 | 碎石机设备-欧版反击破-欧版颚式破碎机(站)厂家_山东奥凯诺机械 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 |