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:
x == float('+inf')
math.isinf(x) and x > 0
Façons de tester l'infini négatif:
x == float('-inf')
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.
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.
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)