質問編集履歴

1 回答を参考にして、time.perf_counter()の値を検証しました。

takey

takey score 279

2017/02/16 10:04  投稿

time.perf_counter()の最大値と最小値はなんですか?
Raspbian Jessieでpython3.4.2を使用しています。
タイムアウト秒経過したら処理を抜けるプログラムを書いています。
```python
import time
elapsed_sec = 0.0
pre_time   = time.perf_counter()
while elapsed_sec <= timeout_sec:
 (処理)
 now_time    = time.perf_counter()
 elapsed_sec += now_time - pre_time
 pre_time    = now_time
```
このプログラムは、time.perf_counter()がオーバーフローしたら意図しない動作をしてしまいます。
time.perf_counter()の最大値を知りたい(というか、とりうる値の範囲を知りたい)のですが、どうすればいいでしょうか?
time.perf_counter()の最大値を知りたい(というか、とりうる値の範囲を知りたい)のですが、どうすればいいでしょうか?
[追記1]
回答より、想像以上に早くオーバーフローしそうだということで、1分ごとのtime.perf_counter()の値をperf_counter.historyファイルに保存するコードを書きました。
```python
#-*- coding:utf-8 -*-
import time
import datetime
while 1:
 time.sleep(60)
 d = datetime.datetime.now()
 timestamp = "{}:{}:{}".format(d.hour, d.minute, d.second)
 perf_c   = str( time.perf_counter() )
 text     = "[{}]{}\r\n".format(timestamp, perf_c)
 f = open("/var/tmp/perf_counter.history", "a")
 f.write( text )
 f.close()
```
↓perf_counter.history
```
[17:19:6]5345.205548377
[17:20:6]5405.256627527
[17:21:6]5465.262088711
[17:22:6]5525.313487511
...
(略)
...
[8:40:40]60639.65602925
[8:41:40]60699.664641323
[8:42:40]60759.669727713
```
ファイルを眺めた所、オーバーフローはしていませんでした。
そもそもtime.perf_counter()の型は何?と思い調べた所、float型でした。
```
>>> import time
>>> type( time.perf_counter() )
<class 'float'>
```
float型ということは、オーバーフローした後はマイナスの値を取る可能性があります。
ここで、pythonのfloat型の範囲がわからなかったので調べた所、次のサイトにヒントが書いてありました。
[文系のための「数値型」(2)](http://cis-jp.blogspot.jp/2012/12/blog-post_13.html)
> さて、次に実際の「有効桁数」と「精度」について見てみる。
Python の数値型は、C言語の数値型を借用していることはすでに述べた。
では、C言語のどの型を借用しているのか?
int    ← C言語のlong型
long  ← C言語には無い?
float  ← C言語におけるdouble型
なんと、C言語のデータ型の大きい方だけを使っているようである。
pythonのfloat型はどうやらdouble型だそうです。
混乱してきたので整理すると、
time.perf_counter()は
・float型の数値を返す
・pythonのfloat型はC言語のdouble型に当たる
・ということは、値の範囲は-2^308~2^308(間違ってたらすみません)
time.perf_counter()のオーバーフロー後の動作が気になりますが、とりあえず「タイムアウト秒経過したら処理を抜ける」コードは次のように変更することで問題を回避できそうです。
```python
import time
elapsed_sec = 0.0
pre_time   = time.perf_counter()
while elapsed_sec <= timeout_sec:
 (処理)
 now_time    = time.perf_counter()
 if now_time > pre_time:
   elapsed_sec += now_time - pre_time
 pre_time    = now_time
```
  • Python 3.x

    10255 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

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