web-dev-qa-db-ja.com

PythonでPOSIX / Unix時間を秒単位およびナノ秒単位で取得しますか?

1970-01-01 00:00:00 UTC以降の時間を秒単位で、ナノ秒をpythonで取得する方法を見つけようとしていますが、適切な精度。

タイムモジュールを使用してみましたが、その精度はマイクロ秒に過ぎないため、試したコードは次のとおりです。

import time

print time.time()

次のような結果が得られました。

1267918039.01

ただし、次のような結果が必要です。

1267918039.331291406

UNIX時間を秒とナノ秒で表現する方法を知っている人はいますか?適切な精度を設定したり、正しい形式で結果を取得したりする方法が見つかりません。助けてくれてありがとう

39
Bill

文字列のフォーマットが原因で精度が失われています。

>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594
36
MattH

Python 3.7以降、 time.time_ns() で簡単に実現できます。

time()と似ていますが、エポック以降のナノ秒の整数として時間を返します。

Python 3.7リリース: PEP 564:ナノ秒の解像度で新しい時間関数を追加 のナノ秒を含むすべての新機能

12
vishes_shell

この問題は、おそらくPythonではなく、OSに関連しています。 timeモジュールのドキュメントを参照してください: http://docs.python.org/library/time.html

_time._time()

UTCで、エポック以降の秒で表される浮動小数点数として時刻を返します。時間は常に浮動小数点数として返されますが、すべてのシステムが1秒よりも正確な時間を提供するわけではないことに注意してください。この関数は通常、減少しない値を返しますが、2つの呼び出しの間にシステムクロックが戻されている場合、前の呼び出しよりも低い値を返すことができます。

つまり、OSでできない場合、Pythonできません。戻り値に適切な大きさを掛けて、ナノ秒の値を取得できます。 、不正確かもしれません。

編集:戻り値はフロート変数なので、OSがそのレベルの精度を持っているかどうかに関係なく、コンマの後の桁数は異なります。ただし、固定小数点文字列表現が必要な場合は、_"%.nf"_でフォーマットできます。ただし、nは必要な桁数です。

9
Alan Plum

クロックのタイプとOSおよびハードウェアによって異なりますが、ナノ秒の精度を取得することもできますtimeモジュールのドキュメント から:

さまざまなリアルタイム関数の精度は、それらの値または引数が表現される単位によって提案されるよりも低い場合があります。例えば。ほとんどのUnixシステムでは、クロックは1秒に50回または100回だけ「刻み」ます。

Python 3、timeモジュールは、それぞれ異なるプロパティを持つ5種類のクロックへのアクセスを提供します;これらの一部mayナノ秒精度のタイミングを提供します time.get_clock_info() function を使用して、各クロックが提供する機能とレポートされる精度時間を確認します。

OS X 10.11ラップトップで利用可能な機能は次のとおりです。

_>>> for name in ('clock', 'monotonic', 'perf_counter', 'process_time', 'time'):
...     print(name, time.get_clock_info(name), sep=': ')
...
clock: namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06)
monotonic: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
perf_counter: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
process_time: namespace(adjustable=False, implementation='getrusage(RUSAGE_SELF)', monotonic=True, resolution=1e-06)
time: namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06)
_

time.monotonic() または time.perf_counter() 関数を使用すると、理論的にはナノ秒の解像度が得られます。どちらの時計も私に壁時間を与えません、経過時間のみ。それ以外の値は任意です。しかし、それらは、何かがかかった時間を測定するのに便利です

6
Martijn Pieters

現在のマシンから実際にナノ秒の精度が得られることはほとんどありません。

マシンは精度を上げることができず、適切でない場合に有効数字を表示することは正しいことではありません。

4
janm

ナノ秒単位で時間を取得するためのプラットフォームに依存しない方法(サードパーティがコード化したものもありますが、見つけることができません)はないと思います。プラットフォーム固有の方法で行う必要があります。たとえば、 this SO question の答えは、「リアルタイム」操作用にlibrt.soシステムライブラリを提供するプラットフォームで実行する方法を示しています。

2
Alex Martelli