[英]difference between np.inf and float('Inf')
NumPy np.inf
和float('Inf')
之間有什么區別嗎? float('Inf') == np.inf
返回True
,所以看起來它們是可以互換的,因此我想知道為什么 NumPy 定義了自己的“inf”常量,我什么時候應該使用一個常量而不是另一個(考慮樣式也有顧慮)?
除了與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'))
float
這很有趣,因為 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
常量,這一點是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 已經為你做了那又何必呢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.