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

时间:2015-01-23 02:55:30

标签: python infinity

math.isinf()测试阳性或阴性无穷大集中在一起。什么是pythonic方式明确地测试它们?

测试正无穷大的方法:

  1. x == float('+inf')
  2. math.isinf(x) and x > 0
  3. 测试负无穷大的方法:

    1. x == float('-inf')
    2. math.isinf(x) and x < 0
    3. 反汇编方式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
      

      This answer似乎偏向Way 2,除了x> 0。

2 个答案:

答案 0 :(得分:16)

&#34; pythonic&#34;方法是使用可读和可维护的东西。

尽管如此,x == float("inf")x == float("-inf")对我来说更具可读性,我更喜欢它们。 math.isinf(x) and x > 0速度更快,但每次调用仅约40 纳秒

因此,除非您检查了大量数字,否则不会对运行时间产生太大影响。

答案 1 :(得分:4)

还有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)