2017-10-20 42 views
2

我對time.time()函數的某些行爲有點困惑,並且對我是否只是無知而感到好奇。連續,同線函數調用與解包

好了,所以我知道我可以解壓和分配兩個函數調用是這樣的:

>>> import time 
>>> beg, end = time.time(), time.time() 
>>> beg == end 
True 

這種平等是有道理的,因爲在執行的時候,第一time.time()和第二time.time()是相同的 - 他們在同一時間點進行評估。

更重要的是混亂的是:

>>> beg = time.time(); end = time.time() 
>>> beg == end 
True 

這種平等,我覺得很奇怪。我猜time.time()只能舍入到7位小數,也許Python的速度足以在小於0.0000001秒內執行這兩個命令(我的直覺告訴我這是這種情況)。我認爲這是平等的,也許只是Python的是一個時間真快,所以我嘗試了很多次:

for _ in range(10000): 
    beg = time.time(); end = time.time() 
    assert beg == end 

對於我來說,這引起了不AssertionError。這是什麼交易? Python比我信任它更快嗎?我的假設是,;-分隔陳述連續評估,但不是同時(因此我驚訝beg從來沒有不等於end)。

編輯:

這裏是time.time()回報我,用我的機器的規格一起:

Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> import time 
>>> time.time() 
1508532204.5873115 
>>> time.time() 
1508532250.9893117 
+0

這對我來說每一次的假。你真的從'time.time()'中得到了什麼?你的系統時間是多少?它實際上是在滴答滴答嗎? – user2357112

+0

此外,「在執行的時候,第一個選定了time.time()和第二了time.time()是相同的 - 他們在同一時間點評估」 - 這不是它是如何工作的。 – user2357112

+0

@ user2357112如何「它的工作」呢?在元組解包的例子中,它們是否也被連續評估? – blacksite

回答

2

首先,關於展開列表中的假設是錯誤的。 beg, end = time.time(), time.time()可以提供不同的時間值,因爲time()函數計算兩次,並且可以返回單獨的結果。

具體而言,Python首先構建一個包含兩個時間值的元組(time.time(), time.time())。然後將該元組解包到變量beg, end中。

並沒有什麼特別的魔法可以使用paralellisation或值緩存,甚至var-by-var賦值(考慮:a,b = b,a值交換模式:它的字面意思是t = (b,a); (a,b) = t)。


其次,時間戳比較高度依賴於您的系統(主要是操作系統)。

對於time.time(),細粒度的分辨率只是不能保證:

注意,即使時間總是返回浮點 數量,而不是所有的系統提供時間比1更好的精度第二個是 。

在unix系統上(不是MacOSX),您可以嘗試使用time.clock_getres(clk_id)來獲得時鐘分辨率。

在Windows上,因爲它似乎是你的話,你也許可以找到從Win32中的信息調用到手冊time.clock()中提到QueryPerformanceCounter()(我沒有足夠的知識上的Windows API的評論)。

你也應該對谷歌的時間精度您的操作系統來回答這個問題,因爲它是沒有太大的蟒蛇相關。

如果分辨率是不夠的,這樣的測量,並且CPU速度非常快(通常用於現今),則時間測量將是太近區分它們。當然,如果在CPU中進行測量,它們將會不同並且相距甚遠。但最小可用時間單位沒有區別。

要注意的是,嘗試在慢得多的機器上執行您的代碼,或者CPU在某些計算任務(即99-100%CPU使用率)下高負載時,並且不能在您的進程上花費太多時間。如果CPU不僅僅忙於一個進程,而且更經常地在多個進程之間切換上下文 - 例如,通過擁有數百個CPU密集型進程或者1-2千個只是空閒的CPU(如在叉式炸彈中)。


UPD:要在問題的補充細節:的逗號後的位數隻字未提你的機器上的時間分辨率,但它不是1秒。

操作系統只是測量1秒的幀之內的東西。結果不僅取決於時鐘分辨率,而且取決於時間請求,並且可能會有所不同。

且不說與浮動精度,其中所述級分可以被不適當地四捨五入到最接近的「嵌合」浮動的問題。這取決於有多大逗號之前的部分比較彩車精度:

>>> 2/3 
0.6666666666666666 

>>> 2000000/3 
666666.6666666666 

>>> 200000000000/3 
66666666666.666664 # <== Surprise! ;-)