亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用Python的timeit計時代碼段以測試性能?

如何使用Python的timeit計時代碼段以測試性能?

慕森王 2019-10-08 14:39:03
我有一個Python腳本,該腳本可以正常工作,但是我需要編寫執行時間。我已經用谷歌搜索了,timeit但我似乎無法使其正常工作。我的Python腳本如下所示:import sysimport getoptimport timeitimport randomimport osimport reimport ibm_dbimport timefrom string import maketransmyfile = open("results_update.txt", "a")for r in range(100):    rannumber = random.randint(0, 100)    update = "update TABLE set val = %i where MyCount >= '2010' and MyCount < '2012' and number = '250'" % rannumber    #print rannumber    conn = ibm_db.pconnect("dsn=myDB","usrname","secretPWD")for r in range(5):    print "Run %s\n" % r            ibm_db.execute(query_stmt) query_stmt = ibm_db.prepare(conn, update)myfile.close()ibm_db.close(conn)我需要的是執行查詢并將其寫入文件所需的時間results_update.txt。目的是測試具有不同索引和調整機制的數據庫更新語句。
查看完整描述

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()。


查看完整回答
反對 回復 2019-10-08
?
喵喔喔

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


查看完整回答
反對 回復 2019-10-08
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

除了時間之外,您顯示的這段代碼是完全不正確的:您執行100個連接(完全忽略除最后一個連接之外的所有連接),然后在您執行第一個執行調用時將其傳遞給局部變量query_stmt,該局部變量僅在執行之后初始化呼叫。


首先,使您的代碼正確,而不必擔心時間安排:即建立或接收連接并對該連接執行100或500或任意數量的更新的函數,然后關閉該連接。一旦您的代碼正常工作,便是考慮在其上使用的正確點timeit!


具體來說,如果要計時的函數是一個無參數的函數,則foobar可以使用timeit.timeit(2.6或更高版本-在2.5及更高版本中更為復雜):


timeit.timeit('foobar()', number=1000)

你最好指定運行的次數,因為默認情況下,上百萬,可能是高為您的使用情況(導致該代碼;-)花費了大量的時間。


查看完整回答
反對 回復 2019-10-08
?
MMMHUHU

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從您的腳本中將其每次重復傳遞給函數。


查看完整回答
反對 回復 2019-10-08
  • 4 回答
  • 0 關注
  • 1184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號