问题
math.isinf() tests for positive or negative infinity lumped together. What's the pythonic way to test for them distinctly?
Ways to test for positive infinity:
x == float('+inf')
math.isinf(x) and x > 0
Ways to test for negative infinity:
x == float('-inf')
math.isinf(x) and x < 0
Disassembly Way 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
Disassembly Way 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 seems to favor Way 2 except for the x>0.
回答1:
The "pythonic" way is to go with what's readable and maintainable.
That said, x == float("inf")
and x == float("-inf")
are slightly more readable to me, and I'd prefer them. math.isinf(x) and x > 0
is faster, but only on the order of about 40 nanoseconds per call.
So unless you're checking a whole lot of numbers, it isn't going to make much of a difference in running time.
回答2:
there is also 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)
and then there is general isinf
>>> np.isinf([np.inf, 0, -np.inf])
array([ True, False, True], dtype=bool)
来源:https://stackoverflow.com/questions/28102302/testing-for-positive-infinity-or-negative-infinity-individually-in-python