我正在对大约1000万的ndarray进行一些分析。
源数据编号范围为1.00到1000.00,小数点后2位。
我发现使用32位浮点数,以及50%的浮点值,在执行浮点运算时速度提高了约30%。
我正在考虑将所有数据转换为32位。如果我这样做,我将来可能遇到任何问题吗?
编辑:
对代码进行一些测试,如果我使用numba迭代这些数据,那么32位的性能会慢一些。
但如果我使用numpy并进行矢量化操作,则32位速度要快得多。
有什么可以解释这个?
from numba import autojit
@autojit( nopython=True )
def nsum( x ):
r=0.0
for i in range( x.shape[0] ):
r+=x[i]
return r
y64 = np.random.randn( 1e7 )
y32 = y64.astype( np.float32 )
%timeit nsum( y64 )
%timeit nsum( y32 )
> 100 loops, best of 3: 18.3 ms per loop
> 100 loops, best of 3: 18.6 ms per loop
%timeit y64**2
%timeit y32**2
> 10 loops, best of 3: 54.4 ms per loop
> 10 loops, best of 3: 27.3 ms per loop
答案 0 :(得分:2)
由于您正在使用这种有限的浮点数子集,因此您应该考虑使用100到100000之间的整数来容纳两个小数空格。
整数也是32位,但在简化操作方面更快,并且没有失去精度方面具有一些优势。
这将取决于你将如何处理这些数字。
答案 1 :(得分:1)
32位浮点数的精度较低,这可能会或可能不会成为您的应用程序的问题。
因为你有一个固定的小数位数,你可能最好切换到定点数学。您可以将所有内容存储为整数,按比例放大100倍。这意味着12.34将存储为1234.您的数学将是精确的(没有浮点错误),并且因为它是全部整数,它应该比浮点数学。然而,它确实使事情变得更复杂 - 你需要知道乘法和除法时小数点的移动方式。
答案 2 :(得分:1)
如果您需要更高的精度,则需要使用64位浮点数。
计算机通过将数字表示为位和位来工作。字节。在float的情况下,字节的某些部分用于整数,一些用于分数。根据需要表示的内容,移动小数(因此为“浮点”),因此允许具有较小小数精度的较高整数或具有较多小数精度的较低整数。
如果您的范围是1到1000且只有两位小数,那么即使32位浮点数可能太多但假设这是您的输入函数所需的,那么是 - 使用32位浮点数除非您需要非常大的数字或十进制精度。
来源:我试图简化复杂的comp-sci主题。有关详细信息,请参阅此处:http://en.wikipedia.org/wiki/Floating_point