math.isinf() 正または負の無限大をまとめてテストします。それらを明確にテストするPythonの方法は何ですか?
正の無限大をテストする方法:
x == float('+inf')
math.isinf(x) and x > 0
負の無限大をテストする方法:
x == float('-inf')
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を支持しているようです。
「Python的な」方法は、読み取り可能で保守可能なものを使用することです。
とは言っても、x == float("inf")
とx == float("-inf")
は私にとって少し読みやすいので、私はそれらを好むでしょう。 math.isinf(x) and x > 0
はより高速ですが、呼び出しごとに約40 nanoseconds程度です。
そのため、多数の数字をチェックしない限り、実行時間に大きな違いは生じません。
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)