2012-08-23 39 views
2

這是我在stackoverflow.com上的第一個問題,所以請對我寬大:)我有一個關於理論上如何創建秒錶程序的問題。我寫哪一種語言並不重要。這理論上是否可行?理論上如何編制秒錶?

a = 0 
While 1 == 1: 
    Print(a) 
    Sleep(1s) 
    a = a+1 

這對我的眼睛應該是美好的,但在Python運行類似的事情時,不能準確地打印出來。用我的「真實」模擬秒錶測量它,有時不到1秒,有時超過1秒。我想知道的是如何從理論上創建一個秒錶,我不需要實際的代碼。我希望你明白我的問題,等待回覆:)

+0

看看使用Timer對象。 http://docs.python.org/release/2.5.2/lib/timer-objects.html – jac

+0

我做了這一點: '進口日期時間 現在= datetime.datetime.now() 而1 == 1: print(now.second)'我的問題是:爲什麼只打印一個值?在我的輸出中,我可以看到:'12 12 12 12 12 12 12 12 12 12 12'我知道這有點超出主題,但不值得提出一個新問題。 – mbgfa

+0

因爲在進入循環之前,您只設置了一次您的now變量。您需要更新now變量,因此您需要將其設置在循環中。 – jac

回答

4

檢查了這一點:Stopwatch In Python

因此,要回答你的問題:是的,這是可能的。

至於你的原代碼的準確性:How accurate is python's time.sleep()?

+0

謝謝,所以如果「對於非實時操作系統的庫存Windows,您可以睡眠的最小時間間隔大約爲10-13ms」。我如何創建精確的秒錶,以千分之幾秒計數?例如,0.001 0.002? – mbgfa

+0

這裏是另一個例子和關於分辨率的討論,http://stackoverflow.com/questions/1938048/high-precision-clock-in-python – jac

+0

@MichałDurak如果最小的間隔是10-13ms,我不確定你實際上可以按ms計算。 –

2

sleep,不能保證睡眠給定時間的確切數額;它會睡大約那麼長的時間,但可能會稍微偏離。當然,如果每次都在同一個方向上稍微偏離一點,那就會開始累積,並且你的回答最終會非常糟糕。

幸運的是,您的電腦配備了一個不會漂移得非常快的時鐘,您可以將其用作秒錶。每次睡一秒鐘,而不是每一秒鐘睡一會兒(例如百分之一秒)。每次醒來,測試當前時間。如果從開始時間開始已經過去了一秒鐘,請打印它。

+0

那麼,我的電腦的鐘表如何製作,它不會那麼快?非常複雜的軟件,還是硬件? – mbgfa

+0

@Micechal實際上是一種組合。有一部分硬件被稱爲[實時時鐘](http://en.wikipedia.org/wiki/Real-time_clock),用於記錄時間。這不會漂移很快;它基本上等價於一個帶有晶體振盪器的數字手錶,並且它有一個電池,即使在計算機關閉時也能保持時間。然而,它最終會漂移,因此[網絡時間協議NTP](http://en.wikipedia.org/wiki/Network_Time_Protocol)用於保持它與更準確的時鐘同步,例如使用的原子鐘設定官方時間標準。 –

0

打印以非常規方式發生的原因可能是輸出緩衝。如果您爲標準輸出禁用緩衝,則它應該按預期工作;見Disable output buffering

運行現有腳本時,您可以通過將-u選項提供給python(至少在Linux上)來實現此目的。 From man python

-u強制stdin,stdout和stderr完全無緩衝。在重要的系統上,還可以將stdin,stdout和stderr放在 二進制模式中。 請注意,在xreadlines(),readlines()和文件對象迭代器(「for sys.stdin中的行」)中存在內部緩衝區,因此該選項不會影響 。要解決這個問題,你需要在「while 1:」循環中使用「sys.stdin.readline()」。