1.去掉不必要的显式for,改为向量化计算(numpy)
- numpy为什么比for快?
- 涨知识
- 对于科学计算有什么可以提高运算?
import timeit
import numpy as np
def for_sum(n):
'''生成一个数组,10000,每一项元素加1'''
list_data=np.arange(0,n,1)
for i in range(len(list_data)):
list_data[i]+=1
return list_data
print('for_sum:',timeit.timeit(stmt='for_sum(10000)',setup='from __main__ import for_sum',number=1000))
def np_sum(n):
list_data=np.arange(0,n,1)
list_data+=1
return list_data
print('np_sum',timeit.timeit(stmt='np_sum(10000)',setup='from __main__ import np_sum',number=1000))
'''
for_sum: 3.8908879
np_sum 0.010136000000000145
'''
2.使用numba加速
import numba as nb
@nb.jit()
def nb_sum(n):
list_data = np.arange(0, n, 1)
for i in range(len(list_data)):
list_data[i] += 1
return list_data
print('nb_sum:',timeit.timeit(stmt='nb_sum(10000)',setup='from __main__ import nb_sum',number=1000))
3.使用多进程(开核)
- 并发:单核cpu交替执行多任务,竞争资源,有处理多任务的能力
- 并行:多核cpu同时执行多任务,各尽其责,互不干扰,有同时处理多任务的能力
- 同步是阻塞模式,请求资源未响应时,会一直等待(由调用方主动询问)
- 异步是非阻塞模式,请求资源未响应时,去执行其他操作,系统通知后再返回接着执行(由被调用方通知)
4.使用sklearn.extenals.joblib扩展库
5.使用bottleneck库(基于Cpython实现,高性能)