Fork me on GitHub

至简

Be simple

为了寻找你,我把自己搬进鸟的眼睛,经常盯着路过的风。


Numpy效率测试


很多人都说Python慢,但也许只是打开方式不对,在实现同等功能下,优先使用numpylist次之,最后是pandas,但同样是使用numpy,打开方式不同,其效率也会有天壤之别,下面就贴出在实际开发中碰到的一些细节,以作探讨。

构造数据方式对效率的影响

直接上例子,下面是实现缺失值填充的一段代码:

import numpy as np

def fill_mean(data):  #对每列数据进行缺失值填充,填充值为均值

    for col in range(data.shape[1]):
        current_col = data[:, col]  #col列
        nan_num = np.count_nonzero(current_col != current_col)
        if nan_num != 0:
            current_col_of_no_nan = current_col[current_col == current_col]
            current_col[np.isnan(current_col)] = current_col_of_no_nan.mean()
			
    return data	

下面为数据构造函数:

def data_generation(row_num, col_num, order):

    data = np.arange(row_num * col_num).reshape((row_num, col_num), order=order).astype("float")
    for col in range(data.shape[1]):
        rand_num = np.random.randint(0, data.shape[0])
        data[rand_num, col] = np.nan  #对每列数据某一随机位置赋值`nan`
		
    return data	

我们测试一下运行时间:

import time
#测试1
data = data_generation(row_num=99999, col_num=99, order='F')
t_start = time.time()
data = fill_mean(data)
t_end = time.time()
print(t_end - t_start)  #0.039896488189697266
#测试2
data = data_generation(row_num=99999, col_num=99, order='C')
t_start = time.time()
data = fill_mean(data)
t_end = time.time()
print(t_end - t_start)  #0.7071127891540527

我们可以看到,在只有order不同的情况下,测试2的运行时间竟然是测试1的将近20倍!这是因为在填充缺失值时,我们是按列操作(这也是机器学习中大部分情况),所以我们在构造数据的时候就要以测试1方式创建,即以column为主在内存中排列。