2017-08-31 91 views
0

下面的Python代碼試圖兩次運行相同的功能和輸出運行:爲什麼在同一個輸入中運行同樣的函數兩次會浪費python的不同時間?

def test_f(f1,ip): 
    st = time.time() 
    f1(*ip) 
    print(time.time()-st) 

test_f(math.sin,[100]) 
test_f(math.sin,[100]) 

的三個測試產出低於:

7.15255737305e-06 
1.19209289551e-06 

7.86781311035e-06 
9.53674316406e-07 

6.91413879395e-06 
9.53674316406e-07 

我不知道爲什麼輸出是如此不同?爲什麼第二次執行比第一次更快?我也嘗試運行五次,結果如下:

8.10623168945e-06 
1.19209289551e-06 
0.0 
0.0 
0.0 
+2

「時間」與其他計時方法相比並不十分準確。請嘗試使用'timeit.timeit'運行我們的測試。 –

回答

1

在CPython的,當一個模塊編譯,將創建一個代碼對象(其中包含字節碼),但實際的函數調用需要框架對象(涉及一些運行時分配和初始化)。作爲一種優化,這些框架對象有時保持爲「殭屍」以供以後重用。下面是在源frameobject.c廣泛註釋的一部分:

/*堆棧幀分配,並在相當大的速率釋放。 在試圖改善的功能調用速度,我們:

如果你正在觀察不是time.time在該決議不可靠的一個簡單的神器,它是創造之間的時間差一個殭屍(更慢)和reanimating一個殭屍(更快)。

相關問題