在Python中单独测试正无穷大或负无穷大

Bob*_*ein 23 python infinity

math.isinf()测试正或负无限集中在一起.什么是pythonic方式明确地测试它们?

测试正无穷大的方法:

  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
Run Code Online (Sandbox Code Playgroud)

拆卸方式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
Run Code Online (Sandbox Code Playgroud)

除了x> 0之外,这个答案似乎更倾向于方式2.

jme*_*jme 25

"pythonic"方式是使用可读和可维护的方式.

这就是说,x == float("inf")x == float("-inf")稍微更具可读性给我,我宁愿他们.math.isinf(x) and x > 0更快,但每次通话仅约40 纳秒.

因此,除非你检查了很多数字,否则它不会对运行时间产生太大影响.


muo*_*uon 5

也有 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)
Run Code Online (Sandbox Code Playgroud)

然后有一般 isinf

>>> np.isinf([np.inf, 0, -np.inf])
array([ True, False,  True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)