python time 模組
計算機的系統時鐘設定為特定的日期、時間和時區。內建的 time 模組讓 Python程式能讀取系統時鐘的當前時間。在 time 模組中, time.time()和 time.sleep()函式是最有用的模組。
time.time()函式 Unix 紀元是程式設計中經常參考的時間: 1970 年 1 月 1 日 0 點,即協調世界時(UTC)。 time.time()函式返回自那一刻以來的秒數,是一個浮點值(回想一下,浮點值只是一個帶小數點的數)。這個數字稱為 UNIX 紀元時間戳。例如,在互動式環境中輸入以下程式碼:
>>> import time >>> time.time() 1425063955.068649
這裡,我在 2015 年 2 月 27 日,太平洋標準時間 11:05(或 7:05 PM UTC),呼叫time.time()。返回值是 Unix 紀元的那一刻與 time.time()被呼叫的那一刻之間的秒數。紀元時間戳可以用於剖析程式碼,也就是測量一段程式碼的執行時間。如果在程式碼塊開始時呼叫 time.time(), 並在結束時再次呼叫,就可以用第二個時間戳減去第一個,得到這兩次呼叫之間經過的時間。例如,開啟一個新的檔案編輯器視窗,然後輸入以下程式:
import time def calcProd(): # Calculate the product of the first 100,000 numbers. product = 1 for i in range(1, 100000): product = product * i return product startTime = time.time() prod = calcProd() endTime = time.time() print('The result is %s digits long.' % (len(str(prod)))) print('Took %s seconds to calculate.' % (endTime - startTime))
我們定義了函式 calcProd(),迴圈遍歷 1 至 99999 的整數,返回它們的乘積。我們呼叫 time.time(),將結果儲存在 startTime 中。呼叫 calcProd()後,我們再次呼叫 time.time(),將結果儲存 endTime 中。最後我們列印 calcProd()返回的乘積的長度,以及執行 calcProd()的時間。將該程式儲存為 calcProd.py,並執行它。輸出看起來像這樣:
The result is 456569 digits long.
Took 2.844162940979004 seconds to calculate.
另一種剖析程式碼的方法是利用 cProfile.run()函式。與簡單的 time.time()技術相比,它提供了詳細的資訊。 cProfile.run()函式在 https://docs.python.org/3/library/profile.html 有解釋。
time.sleep()函式 如果需要讓程式暫停一下,就呼叫 time.sleep()函式,並傳入希望程式暫停的秒數。在互動式環境中輸入以下程式碼
>>> import time
>>> for i in range(3):
... print('Tick')
... time.sleep(1)
... print('Tock')
... time.sleep(1)
...
Tick
Tock
Tick
Tock
Tick
Tock
>>> time.sleep(5)
for 迴圈將列印 Tick,暫停一秒鐘,列印 Tock,暫停一秒鐘,列印 Tick,暫停,如此繼續,直到 Tick 和 Tock 分別被列印 3 次。time.sleep()函式將阻塞(也就是說,它不會返回或讓程式執行其他程式碼),直到傳遞給 time.sleep()的秒數流逝。例如,如果輸入 time.sleep(5) ,會在 5 秒後才看到下一個提示符(>>>)。請注意,在 IDLE 中按 Ctrl-C 不會中斷 time.sleep()呼叫。 IDLE 會等待到暫停結束,再丟擲 KeyboardInterrupt 異常。要繞過這個問題,不要用一次 time.sleep(30)呼叫來暫停 30 秒,而是使用 for 迴圈執行 30 次 time.sleep(1)呼叫。
>>> for i in range(30):
... time.sleep(1)
如果在這 30 秒內的某個時候按 Ctrl-C, 應該馬上看到丟擲 KeyboardInterrupt 異常。