如何使用python timeit模組使用實踐

2021-09-07 08:42:22 字數 2750 閱讀 3486

其實平時使用測試應用執行時間的情況 細算一下還真的很少。很久沒有做效能優化的工作,不管是cprofile還是timeit模組都已經生疏了很久沒有使用,我在以前的文章裡面有提到過cpfile的效能測試使用,但是一直沒有使用過這個更輕量級的執行時間測量庫進行過仔細實踐總結,今天就來總結一下。

從最簡單的例子開始,比如我們想測試乙個列表推導式究竟要比正常寫for快多少。

import

timeit

foooo = """

sum =

for i in range(1000):

"""print timeit.timeit(stmt="

[i for i in range(1000)]

", number=100000)

print timeit.timeit(stmt=foooo, number=100000)

輸出:

3.79257702827

9.0510661602

不難看出,使用列表推導式要比正常使用list追加元素 通過10w次迴圈會快上近5.3秒左右,速度快上近三倍。

timeit 模組抽象出了;兩個可以直接使用的方法,包了一層可以讓我們不用關心內部的實現,下面看一下模組裡面的**:

def timeit(stmt="

pass

", setup="

pass

", timer=default_timer,

number=default_number):

"""convenience function to create timer object and call timeit method.

"""return

timer(stmt, setup, timer).timeit(number)

def repeat(stmt="

pass

", setup="

pass

", timer=default_timer,

repeat=default_repeat, number=default_number):

"""convenience function to create timer object and call repeat method.

"""return timer(stmt, setup, timer).repeat(repeat, number)

可以看到這兩個方法都是對timer類包了一層這幾個引數:

stmt: 這個引數就是statement,可以把要進行計算時間的**放在裡面。他可以直接接受字串的表示式,也可以接受單個變數,也可以接受函式。

setup:  這個引數可以將stmt的環境傳進去。比如各種import和引數什麼的。

timer: 這個引數一般使用不到,具體使用可以參看文件。

timer類下面還有repeat和timeit方法 使用也非常方便就是 timeit.timeit 和  timeit.repeat。

乙個就是上面例子的timeit,乙個就是repeat 其實repeat就比timeit多了乙個執行timer次數的引數。這個執行次數會以陣列的形式返回每次執行的時間 like this

import

timeit

foooo = """

sum =

for i in range(1000):

"""print timeit.repeat(stmt="

[i for i in range(1000)]

", repeat=2, number=100000)

輸出[4.466734170913696, 4.255025148391724]

我們可以根據此,對所有執行時間取min最小值,平均值,最大值得到我們想要的資料。感覺還是十分方便的。

貼乙個稍微高階的例子,就是用到了一下setup引數的例子,是我在測試protocol buffer python的時候的例子:

#

coding: utf-8

import

timeit

#初始化類

x = """

say_hi.parsefromstring(p)

"""y = """

******json.loads(x)

"""print timeit.timeit(stmt=x, setup="

import say_hi_pb2;""

say_hi = say_hi_pb2.sayhi();""

say_hi.id = 13423;""

say_hi.something = 'axiba';""

say_hi.extra_info = 'xiba';""

p =say_hi.serializetostring()

", number=1000000)

print timeit.timeit(stmt=y, setup="

import ******json; ""

json=;""

x = ******json.dumps(json)

", number=1000000

另外需要補充一點是,如果你想直接 stmt 那裡執行函式。可以把函式申明在當前檔案中,然後在 stmt = 『func()』 執行函式。然後使用 setup = 『from __main__ import func』 即可,如果要import 多個需要使用 setup = from __main__ import func; import ******json'

如何使用 滅火器如何使用

滅火器的種類不同使用方法也不相同,下面單獨針對乾粉滅火器 泡沫滅火器和二氧化碳滅火器使用方法說明。一 乾粉滅火器的使用方法 適用範圍 適用於撲救各種易燃 可燃液體和易燃 可燃氣體火災,以及電器裝置火災。1 右手拖著壓把,左手拖著滅火器底部,輕輕取下滅火器。2 右手提著滅火器到現場。3 除掉鉛封。4 ...

如何使用 如何正確使用定速巡航

現在隨著造車技術的不斷創新和改進,越來越多的高科技功能都應用到了汽車上,不僅提供了實用性,也讓我們享受到了科技的快感。今天我們就聊一聊一項可以實現車輛自動駕駛的功能 定速巡航。定速巡航 cruise control system 簡稱ccs,簡單的理解就是給車子設定乙個速度值,駕駛員只需要掌握方向,...

如何使用CFileDialog

cfiledialog的語法 cfiledialog bool bopenfiledialog,lpctstr lpszdefext null,lpctstr lpszfilename null,dword dwflags ofn hidereadonly ofn overwriteprompt,l...