NumPy np.inf
和float('Inf')
之间有什么区别吗?
float('Inf') == np.inf
返回True
,所以看起来它们是可以互换的,因此我想知道为什么NumPy定义了自己的“inf”常量,何时我应该使用一个常量而不是另一个(考虑样式问题) )?
答案 0 :(得分:19)
除了与math.inf
和float('inf')
具有相同的价值:
>>> import math
>>> import numpy as np
>>> np.inf == float('inf')
True
>>> np.inf == math.inf
True
它也有相同的类型:
>>> import numpy as np
>>> type(np.inf)
float
>>> type(np.inf) is type(float('inf'))
这很有趣,因为NumPy也有它自己的浮点类型:
>>> np.float32(np.inf)
inf
>>> type(np.float32(np.inf))
numpy.float32
>>> np.float32('inf') == np.inf # nevertheless equal
True
因此它具有与math.inf
和float('inf')
相同的值和相同的类型,这意味着它可以互换。
np.inf
键入的内容更少:
np.inf
(6个字符)math.inf
(8个字符; python 3.5中的新字符)float('inf')
(12个字符)这意味着如果你已经导入了NumPy,那么与float('inf')
(或math.inf
)相比,每次出现可以节省6(或2)个字符。
因为它更容易记住。
至少对我而言,记住np.inf
要比使用字符串调用float
要容易得多。
此外,NumPy还为无穷大定义了一些额外的别名:
np.Inf
np.inf
np.infty
np.Infinity
np.PINF
它还定义了负无穷大的别名:
np.NINF
同样适用于nan
:
np.nan
np.NaN
np.NAN
常量是常量
这一点基于CPython,在另一个Python实现中可能完全不同。
float
CPython实例需要24个字节:
>>> import sys
>>> sys.getsizeof(np.inf)
24
如果您可以重复使用同一个实例,那么与创建大量新实例相比,您可能会节省大量内存。当然,如果你创建自己的inf
常量,那么这一点就是静音,但如果你没有,那么这就是:
a = [np.inf for _ in range(1000000)]
b = [float('inf') for _ in range(1000000)]
b
将比a
使用24 * 1000000字节(~23 MB)的内存。
访问常量比创建变量更快。
%timeit np.inf
37.9 ns ± 0.692 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit float('inf')
232 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit [np.inf for _ in range(10000)]
552 µs ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [float('inf') for _ in range(10000)]
2.59 ms ± 78.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
当然,您可以创建自己的常量来对抗这一点。但是,如果NumPy已经为你做了那件事,为什么还要费心呢。