math.isinf()测试正或负无限集中在一起.什么是pythonic方式明确地测试它们?
测试正无穷大的方法:
x == float('+inf')
math.isinf(x) and x > 0
测试负无穷大的方法:
x == float('-inf')
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 纳秒.
因此,除非你检查了很多数字,否则它不会对运行时间产生太大影响.
也有 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)