[問題] timeit 測量程式 runtime

看板Python作者 (Lawrence022)時間7年前 (2018/02/15 21:26), 7年前編輯推噓1(1018)
留言19則, 5人參與, 7年前最新討論串1/1
想請問一下 我寫了支程式命名為 test.py 裡面只是要計算138956167218765**342048 如果我用timeit來計算這行code的時間 結果會顯示幾微秒(事實上,執行這支程式的時間沒有這麼短) 但如果我是在command line上下time指令去量test.py的runtime time python test.py 結果是8秒多 代表timeit測得的runtime並不正確囉? 用其他算時間的function(ex. time,datetime)結果也都跟timeit一樣 我想要寫一個能在程式裡面計算每個function的runtime 如果只能用time指令來計算的話 我只能知道這支程式總共的runtime而已 為什麼timeit得到的時間會跟time指令得到的時間不同呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.196.20 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1518701165.A.2A1.html

02/15 21:34, 7年前 , 1F
timeit 只算你的 Python 程式碼的執行時間, time 是從外
02/15 21:34, 1F

02/15 21:34, 7年前 , 2F
部看整個程式的執行時間, 從你下 python 指令到 Python
02/15 21:34, 2F

02/15 21:34, 7年前 , 3F
準備好跑你的程式中間也是要時間的; 這就和你量紙箱尺寸
02/15 21:34, 3F

02/15 21:35, 7年前 , 4F
內外長度會不一樣的道理一樣, 紙箱的材質本身也會佔體積
02/15 21:35, 4F
我也這樣想過。 如果我寫一個modular exponential的function來計算的話(事實上我的計算後面有mod m) 用timeit顯示的也是幾微妙(但比**的方法慢,而time也是幾微秒(比**快) 所以我不知道到底應該算是用我的function快還是**快 ※ 編輯: lawrence022 (180.217.196.20), 02/15/2018 21:49:35 ※ 編輯: lawrence022 (180.217.196.20), 02/15/2018 21:52:56

02/15 22:07, 7年前 , 5F
要注意 time 有很多外部因素, 而且只算一次, 誤差會很大
02/15 22:07, 5F

02/15 22:08, 7年前 , 6F
老實說我不懂你迷惑的點在哪, 很明顯 timeit 的結果合理
02/15 22:08, 6F
應該說我疑惑的點是 程式的runtime不是應該會隨著計算的質改變而有不同嗎? 但我用timeit分別測 1234567**20481 1234567**204812 這兩筆不同質的運算 直覺來想後者runtime一定比較大 但實際測得前者的runtime較大 (前者0.019 後者0.012) 所以我才覺得timeit測runtime是不是不正確 用time就一定都是後者時間比較久 ※ 編輯: lawrence022 (180.217.196.20), 02/15/2018 23:03:09

02/15 23:20, 7年前 , 7F
在形態相同的前提下, 執行時間和計算值並沒有直接關聯
02/15 23:20, 7F

02/15 23:20, 7年前 , 8F
誰教你越大就會算越久的你老實說我保證不揍他
02/15 23:20, 8F

02/16 04:39, 7年前 , 9F
會不會變大你也要看什麼會影響複雜度
02/16 04:39, 9F

02/16 04:39, 7年前 , 10F
可以去github翻code Objects/longobject.c的long_pow
02/16 04:39, 10F

02/16 05:04, 7年前 , 11F
你用time python時有用print顯示結果嗎?大數字要轉換成顯示
02/16 05:04, 11F

02/16 05:06, 7年前 , 12F
的結果也會很耗時間,timeit('print(1234567**204812)',numb
02/16 05:06, 12F

02/16 05:07, 7年前 , 13F
er=1)和不用print就可以看出差異,除非python算大數字時中間
02/16 05:07, 13F

02/16 05:10, 7年前 , 14F
是用10進位在存計算過程和結果.另外,你用1234567**204812這
02/16 05:10, 14F

02/16 05:11, 7年前 , 15F
一個已經算是一個常數,計算的結果可能會被cache.可以改用
02/16 05:11, 15F

02/16 05:12, 7年前 , 16F
timeit.timeit('a=1234567;b=20480;a**b',number=1) 再改不
02/16 05:12, 16F

02/16 05:13, 7年前 , 17F
同的number試看看執行時間
02/16 05:13, 17F

02/22 14:28, 7年前 , 18F
U大好兇XDD
02/22 14:28, 18F

03/06 04:43, 7年前 , 19F
文章代碼(AID): #1QXOfjAX (Python)
文章代碼(AID): #1QXOfjAX (Python)