np.inf 和 float('Inf') 之间的区别



NumPynp.inffloat('Inf')之间有什么区别吗?float('Inf') == np.inf返回True,所以它们似乎是可以互换的,因此我想知道为什么 NumPy 定义了自己的"inf"常量,以及我什么时候应该使用一个常量而不是另一个常量(也考虑样式问题)?

TL,DR:没有区别,它们可以互换使用。

除了具有与math.inffloat('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'))
float

这很有趣,因为NumPy也有它自己的浮点类型:

>>> np.float32(np.inf)
inf
>>> type(np.float32(np.inf))
numpy.float32
>>> np.float32('inf') == np.inf  # nevertheless equal
True

因此,它具有与math.inffloat('inf')相同的值和类型,这意味着它是可互换的。

使用np.inf的原因

  1. 打字少了:
  • np.inf(6 个字符)
  • math.inf(8个字符;Python 3.5 中的新功能)
  • float('inf')(12 个字符)

这意味着如果您已经导入了 NumPy,与float('inf')(或math.inf)相比,每次出现可以节省 6(或 2)个字符。

  1. 因为它更容易记住。

至少对我来说,记住np.inf比我需要用字符串调用float要容易得多。

此外,NumPy为无穷大定义了一些额外的别名:

np.Inf
np.inf
np.infty
np.Infinity
np.PINF

它还定义了负无穷大的别名:

np.NINF

同样对于nan

np.nan
np.NaN
np.NAN
    常量
  1. 是常量

这一点是基于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)的内存。

  1. 访问常量比创建变量更快。

    %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已经为您做了这件事,那又何必呢?

最新更新