2017-05-04 7 views
1

thisの投稿に続いて、私はWindows 7(Enterprise、64ビット、および64ビット)でPythonのtime.sleep Python 3.4.4を参照してください)。ここでPython 3.xおよびWindows 7で不正確なtime.sleep()

が基準の.pyスクリプトです:this例1として

import threading, time 

def Return(): 
    return 

def Setup(): 
    for _ in range(10): 
     time_before = time.time() 
     Return() 
     wait_delay = -time.time() 

     delays = [] 
     InputFrequency = 60 

     while (time.time() - time_before) < (1/InputFrequency): 
      time.sleep(0) 

     wait_delay += time.time() 

     delays.append(wait_delay) 

     print("Output frequency: " + str([1/t for t in delays][0]) + " Hz") 

threading.Thread(target=Setup).start() 

、このスクリプトは、おおよそ60Hzの出力周波数を生成する必要があります。 9.15Hz


入力:20Hzの - 出力: - :

入力:出力10Hzの私のWindows 7 Enterpriseマシン上で実行した場合しかし、これらは、私は与えられた入力周波数に対して受信出力周波数である16.03 Hzの


入力:30Hzを - 出力21.37Hz


入力範囲:40Hzの - 6 4Hzの - 出力:32.05Hz


入力範囲:65Hz - 10kHzのの+ - 出力:64.10Hz


ここで何が起こっていますか?入力周波数が変動する(40Hz以上)のが同じ出力周波数を生成するのはなぜですか?入力周波数が10,000Hzを超える場合でも、出力周波数の上限は64.10Hzですか?私はそれが〜60Hzでtime.sleep()解決の問題だとは思わない。 ideone.comスクリプトに供給される同じ入力周波数値は、予想される出力周波数を生成するので、それは自分のコンピュータに関連していなければなりません。

+0

現在のPythonのバージョンに違いがあるかどうかチェックしましたか? – pvg

+0

私はしませんでしたが、私はPython 2.7.12のインストールをチェックしましたが、同じ誤った出力周波数を与えています。 – jars121

+0

そうですが、ベースラインはpython 3ですので、python 3.6が起動する場所になるかもしれません。 – pvg

答えて

1

Pythonは、これらの呼び出しがどのように動作するかについて、特にクロスプラットフォームを保証していません。ここで間違ってしまう可能性がある2つのことがあります - time.time()の解像度は達成しようとしている解像度より悪く、sleepの解像度はです。ここに報告されるように

睡眠は、最近のプラットフォーム上で正確なおおよそ、少なくとも1〜2ミリ秒のようになります。

How accurate is python's time.sleep()?

これはtime.time()を残します。この特定のコールのためのドキュメントは、精度が低下することが警告:時間は常に浮動小数点 数として返されていても

注意、全てのシステムが1 秒よりも良好な精度で時間を提供します。この関数は通常は減少しない値を返しますが、 は、2つの呼び出しの間にシステムクロックが に設定されていれば、以前の呼び出しよりも低い値を返すことができます。

幸いにも、time.perf_counter()には、プラットフォーム上で使用可能な最高解像度のクロックにアクセスしようとする高解像度クロックAPIが用意されています。パフォーマンスカウンタの

リターン(端数秒)値、短い 継続時間を測定するために利用できる最高の解像度を持つ すなわちクロック:ドキュメントから。睡眠中に経過した時間が含まれ、 システム全体です。返される値の参照ポイントは、 の値が定義されておらず、 という連続した呼び出しの結果の間だけが有効になります。

Windowsの場合、これは問題を解決する60Hzよりも優れているようです。

+0

パーフェクト、もう一度ありがとう! – jars121

関連する問題