web-dev-qa-db-ja.com

Pythonで個別に正の無限大または負の無限大をテストする

math.isinf() 正または負の無限大をまとめてテストします。それらを明確にテストするPythonの方法は何ですか?

正の無限大をテストする方法:

  1. x == float('+inf')
  2. math.isinf(x) and x > 0

負の無限大をテストする方法:

  1. x == float('-inf')
  2. math.isinf(x) and x < 0

分解方法1:

>>> def ispinf1(x): return x == float("inf")
...
>>> dis.dis(ispinf1)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_GLOBAL              0 (float)
              6 LOAD_CONST               1 ('inf')
              9 CALL_FUNCTION            1
             12 COMPARE_OP               2 (==)
             15 RETURN_VALUE

分解方法2:

>>> def ispinf2(x): return isinf(x) and x > 0
...
>>> dis.dis(ispinfs)
  1           0 LOAD_GLOBAL              0 (isinf)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              9 JUMP_IF_FALSE_OR_POP    21
             12 LOAD_FAST                0 (x)
             15 LOAD_CONST               1 (0)
             18 COMPARE_OP               4 (>)
        >>   21 RETURN_VALUE

この回答 は、x> 0を除き、ウェイ2を支持しているようです。

19
Bob Stein

「Python的な」方法は、読み取り可能で保守可能なものを使用することです。

とは言っても、x == float("inf")x == float("-inf")は私にとって少し読みやすいので、私はそれらを好むでしょう。 math.isinf(x) and x > 0はより高速ですが、呼び出しごとに約40 nanoseconds程度です。

そのため、多数の数字をチェックしない限り、実行時間に大きな違いは生じません。

21
jme

numpyもあります

>>> import numpy as np
>>> np.isneginf([np.inf, 0, -np.inf])
array([False, False,  True], dtype=bool)
>>> np.isposinf([np.inf, 0, -np.inf])
array([ True, False, False], dtype=bool)

そして、一般的なisinfがあります

>>> np.isinf([np.inf, 0, -np.inf])
array([ True, False,  True], dtype=bool)
4
muon