很多人都说Python
慢,但也许只是打开方式不对,在实现同等功能下,优先使用numpy
,list
次之,最后是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
为主在内存中排列。