1.数据结构一定要选对
- 假如有百万个数据进行排序,如果选择列表,排序可能需要8分钟,而选用字典,只用了十几秒就能搞定。
2.多用python中封装好的模块库
-
比如numpy,matplotlib,pandas这三个。matplotlib是绘图库,这个就不多说了,numpy和pandas非常强大,
-
numpy主要是用于计算的,里面有一个多维的数组对象叫ndarray,它具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。ndarray类型拥有很多便捷的函数可以进行矩阵运算,
-
而pandas在大数据的处理方面有更加强大的能力。我在这方面的主要应用是将数据保存成.csv## 标题文件和从.csv文件中读入的时候用到了这个模块,用到了pandas中的Dataframe和Series,进行数据运算的时候超级方便。
3. 工具
Cython
- Cython 是Python 的C语言扩展。准确说Cython是单独的一门语言,Cython在提速方面有很大优势 ,它专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟 Python一致,而Cython有专门的编译器:先将 Cython代码转变成C(自动加入了一大堆的C-PythonAPI),然后使用C编译器编译出最终的Python可调用的模块。不过Cython的缺点是,你并不能真正编写Python代码,这样一来,现有代码将 不会完全自动转移成功。
Numba
-
Numba ,是Cython的竞争项目。numba把Python源码通过LLVMPy生成JIT后的.so文件来加速。不同于Cython,Numba是以JIT为主的,加速对源码的侵入性较小。而Cython则重点在加速高性能Python模块的开发上,不依赖LLVMPy项目。此外numba还很不成熟,目前兼容性相当差。
import time def foo(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('Time used: {} sec'.format(time.time()-tt)) return s print(foo(1,100000000))
结果:
Time used: 6.779874801635742 sec
4999999950000000
#使用numba
from numba import jit
import time
@jit
def foo(x,y):
tt = time.time()
s = 0
for i in range(x,y):
s += i
print('Time used: {} sec'.format(time.time()-tt))
return s
print(foo(1,100000000))
结果:
Time used: 0.04680037498474121 sec
4999999950000000
Python创 始人Guido vanRossum坚信Python的许多性能问题可以归结为语言的使用不当。例如,对于CPU消耗过高的处理,可以通过一些方法来加速Python运行——使 用NumPy、使用多处理器扩展、或借助外部C代码从而避免全局解释器锁(GIL)——Python缓慢的根源。但由于在Python中还没有可行的 GIL替代语言,Python仍将在短期落后于其他语言——甚至可能更长时间。
Guido van Rossum还说过:
如果你开发的系统发现了性能瓶颈,通常最有效率的做法是找到出问题的代码块,用速度较快的语言如C或C++写一些代码替换该功能或该模块,而不是用C或C++重写整个系统,因为对大部分代码而言,语言的速度是无关紧要的