回答編集履歴

1 関数名を修正

can110

can110 score 17835

2017/02/15 14:45  投稿

まず[time.perf_counter()](https://docs.python.jp/3/library/time.html#time.perf_counter)を確認したところ
> パフォーマンスカウンターの値 (小数点以下がミリ秒) を返します。クロックは短期間の計測が行えるよう、可能な限り高い分解能をもちます。これにはスリープ中の経過時間も含まれ、システム全体で一意です。
のみで、明確な値の範囲は記載されていませんでした。
しかし[time.clock()](https://docs.python.jp/3/library/time.html#time.clock) によれば
> Unix では、現在のプロセッサー時間秒を浮動小数点数で返します。時刻の精度および “プロセッサー時間” の定義そのものは同じ名前の C 関数に依存します。
> バージョン 3.3 で撤廃: この関数の挙動はプラットフォームに依存します: 必要に応じて挙動が明確に定義されている perf_counter() または process_time() を使用してください。
とのことなので、perf_counter()もC言語のtime関数と同じ動作と推測してみました。
とのことなので、perf_counter()もC言語のclock関数と同じ動作と推測してみました。
そこで[Linux Programmer's Manual (3) CLOCK](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/clock.3.html)を確認すると
> C89, C99, POSIX.1-2001. POSIX は実際の精度にはよらず CLOCKS_PER_SEC が 1000000 であることを要求している。 
時刻は桁あふれする可能性がある点に注意すること。 CLOCKS_PER_SEC が 1000000 である 32 ビットシステムでは、 この関数は約 72 分毎に同じ値を返すことになる。
との記載がありました。意外と短い時間でオーバーフローしそうです。
よって、高い分解能が不要であれば、[datetime.now](https://docs.python.jp/3/library/datetime.html#datetime.datetime.now)を代わりに利用することも検討してもよいかと思います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る