Float16在numpy中比Float32和Float64慢得多

时间:2019-06-21 05:26:53

标签: python performance numpy

我正在尝试运行一个看起来像这样的代码段

import numpy as np
import time

def estimate_mutual_info(X, neurons, bins = 5):
    xy = np.histogram2d(X, neurons, bins)[0]
    x = np.histogram(X, bins)[0]
    y = np.histogram(neurons, bins)[0]
    ent_x = -1 * np.sum( x / np.sum(x) * np.log( x / np.sum(x)))
    ent_y = -1 * np.sum( y / np.sum(y) * np.log( y / np.sum(y)))
    ent_xy = -1 * np.sum( xy / np.sum(xy) * np.log( xy / np.sum(xy)))
    return (ent_x + ent_y - ent_xy)

tic = time.time()
X = np.random.rand(12000, 1200)
Y = np.random.rand(12000, 10)
for j in Y.T:
    mi = 0
    for i in range(X.shape[1]):
        mi += estimate_mutual_info(X.T[i], j, bins = 2)
    print(mi)
toc = time.time()
print(str(toc - tic)+" seconds")

为了提高速度,我使用了float16,希望有所改进,但是float16float32float64慢得多。

X = np.random.rand(12000, 1200).astype('float16')
Y = np.random.rand(12000, 10).astype('float16')

将它们更改为float16将导致执行时间84.57 seconds,而float64float32分别为36.27 seconds33.25 seconds执行。我不确定是什么原因导致flaot16的这种性能下降。我的处理器是64 bit,使用python3.7numpy-1.16.2。我认为64位处理器不会对所有16位,32位和64位漠不关心。任何纠正和见解都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

最可能的解释是您的处理器本身不支持FP16算术,因此所有操作都是在软件中完成的,当然,这要慢得多。

通常,消费型英特尔处理器不支持FP16操作。

答案 1 :(得分:3)

之所以发生这种情况,是因为c中没有float16的等效项。

由于python基于c,因此与c中的等效,因此numpy创建了一个对float16执行的方法。

(float是32位IEEE 754单精度浮点数1位为符号,(8位为指数,23 *为值),即float具有7位十进制精度的数字)

这个(相当于在float16上工作的过程)的休假float16float32float64