web-dev-qa-db-fra.com

Tester l'infini positif ou l'infini négatif, individuellement dans Python

math.isinf () teste l'infini positif ou négatif regroupés. Quelle est la façon Pythonique de les tester distinctement?

Façons de tester l'infini positif:

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

Façons de tester l'infini négatif:

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

Démontage Manière 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

Démontage Manière 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

Cette réponse semble favoriser la voie 2 à l'exception de x> 0.

19
Bob Stein

La façon "Pythonique" est d'aller avec ce qui est lisible et maintenable.

Cela dit, x == float("inf") et x == float("-inf") sont légèrement plus lisibles pour moi, et je les préférerais. math.isinf(x) and x > 0 est plus rapide, mais seulement de l'ordre d'environ 40 nanosecondes par appel.

Donc, à moins que vous ne vérifiiez beaucoup de chiffres, cela ne fera pas beaucoup de différence dans le temps d'exécution.

21
jme

il y a aussi 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)

et puis il y a isinf

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