写Python过程中,有些我们不常注意的细节常常会影响整体的运行效率,如果算法本身难以再优化的时候,我们可以考虑从语法本身出发去加速程序的效率。
1.用set查找代替list查找
如果在代码中查找占很大的比重,那我们就要考虑说,是否可以将list查找都替换成set查找,尽管list是顺序存储结构,按理说检索数的速度很快了,但是用集合set查找会更快。
2.用for循环替代while循环
这两种循环都有自己的适应场景,for循环是一次次地循环(已知循环次数),while是按条件循环(未知循环次数)。如果我们不清楚循环次数情况下,当然是使用while,但是,如果我们知道循环次数,且循环过程也是由迭代数定长地增加,然后一次次地累计循环的话,那我们就优先使用for循环。
如下图所示,实验10次,用while循环的平均用时为微秒,用for循环的平均用时为微秒;其实很好理解,for循环是一步步地从迭代器range中取数,而while函数是每次循环都在迭代数上加1,这两个操作的用时相近,不过,在while中却多了个条件判断i。
3.将重复使用的部分参数化
在代码中,有些操作(比如取数)、或者有些计算,是需要多次操作的,可能是一段代码中多次使用到,也可能是一个循环体里面多次使用到,这样的话,我们就要就将这部分操作、或者计算给参数化,如果是在循环体内就把它放到循环体之外。
注意:是重复被使用的对象,如果是每次循环都加上某个数进行迭代的这种操作,因为每次那个具体的值都会变,所以这不算在这里。
具体地,比如循环中需要反复地用到一个从excel表中取出来的数,或者从某列表中检索出来的数的时候,我们可以在循环体之外先把这些数取出来,赋给某个参数,然后再利用这个参数进行计算,而不是将取数的这个操作放在循环体里面。
如下图,当在循环中重复某个操作时,程序平均运行时间为92微秒,而把这个重复性的操作参数化后,程序的平均运行时间降低到13.1微秒。
4.尽量使用标准库或者内置函数
对于一些Python有标准库,那就尽量使用标准库中的方法或者内置函数去实现,因为这些标准库或内置函数的效率都是优化得很好的,就算自己写代码重复标准库或者内置函数的功能,写的很好也只是在接近它们的效率而已。
5.用numpy的array替代list
numpy是高效处理大型矩阵的库,之所以高效,很大程度取决于它的基础数据结构array。如果程序中处理大型矩阵的机会比较多的话,可以尝试用array替代list,同时array有很多高效且功能强大的计算函数。
如下所示,用list列表需要用循环来乘以整数,列表不能直接乘上整数;但是array结构可以直接和整数相乘(每个数都乘上2),这个小操作就缩减了90%以上的耗时。
6.读写的Excel文件尽量用csv格式
Excel有两种存储格式,一种后缀是.xlsx,一种是.csv,在使用Pandas库读取数据和写入数据的时候,用.csv都会远快于用.xlsx的格式。