4 回答
TA貢獻1839條經驗 獲得超15個贊
您可以在要計時的塊之前或之后使用time.time()或time.clock()。
import time
t0 = time.time()
code_block
t1 = time.time()
total = t1-t0
此方法不完全精確timeit(它不會平均運行幾次),但是很簡單。
time.time()(在Windows和Linux中)和time.clock()(在Linux中)不夠精確,無法實現快速功能(total = 0)。在這種情況下,或者如果要平均幾次運行所花費的時間,則必須多次手動調用該函數(就像我在示例代碼中已經做過的那樣,并且在設置其number參數時timeit會自動執行)
import time
def myfast():
code
n = 10000
t0 = time.time()
for i in range(n): myfast()
t1 = time.time()
total_n = t1-t0
如注釋中所述,在Windows中,Corey time.clock()具有更高的精度(微秒而不是秒),并且優于time.time()。
TA貢獻1735條經驗 獲得超5個贊
如果您要分析代碼并可以使用IPython,則它具有magic函數%timeit。
%%timeit 對細胞進行操作。
In [2]: %timeit cos(3.14)
10000000 loops, best of 3: 160 ns per loop
In [3]: %%timeit
...: cos(3.14)
...: x = 2 + 3
...:
10000000 loops, best of 3: 196 ns per loop
TA貢獻1827條經驗 獲得超8個贊
除了時間之外,您顯示的這段代碼是完全不正確的:您執行100個連接(完全忽略除最后一個連接之外的所有連接),然后在您執行第一個執行調用時將其傳遞給局部變量query_stmt,該局部變量僅在執行之后初始化呼叫。
首先,使您的代碼正確,而不必擔心時間安排:即建立或接收連接并對該連接執行100或500或任意數量的更新的函數,然后關閉該連接。一旦您的代碼正常工作,便是考慮在其上使用的正確點timeit!
具體來說,如果要計時的函數是一個無參數的函數,則foobar可以使用timeit.timeit(2.6或更高版本-在2.5及更高版本中更為復雜):
timeit.timeit('foobar()', number=1000)
你最好指定運行的次數,因為默認情況下,上百萬,可能是高為您的使用情況(導致該代碼;-)花費了大量的時間。
TA貢獻1834條經驗 獲得超8個贊
專注于一件事。磁盤I / O速度很慢,因此如果您要調整的只是數據庫查詢,那么我將不進行測試。
而且,如果您需要安排數據庫執行時間,請改用數據庫工具,例如詢問查詢計劃,并注意性能不僅隨確切的查詢和擁有的索引而變化,還隨數據負載(多少數據)而變化。您已存儲)。
就是說,您只需將代碼放入函數中,然后使用即可運行該函數timeit.timeit():
def function_to_repeat():
# ...
duration = timeit.timeit(function_to_repeat, number=1000)
這將禁用垃圾收集,重復調用該function_to_repeat()函數,并使用來計時這些調用的總持續時間timeit.default_timer(),這是您特定平臺上最準確的可用時鐘。
您應該將設置代碼移出重復功能;例如,您應該首先連接到數據庫,然后僅對查詢進行計時。使用setup參數導入或創建這些依賴項,并將其傳遞給函數:
def function_to_repeat(var1, var2):
# ...
duration = timeit.timeit(
'function_to_repeat(var1, var2)',
'from __main__ import function_to_repeat, var1, var2',
number=1000)
會抓取globals function_to_repeat,var1并var2從您的腳本中將其每次重復傳遞給函數。
添加回答
舉報
