书接上文,我们在前面介绍了for循环的简单优化方法,今天我们深度分析一下for循环的优化思路,还记不记得前一篇文章《数据分析工具篇——for循环运算优化(一)》中的案例:
import timestart_time = time.time()datas = 0for t in range(0, 1000): for i in range(0, 1000): for j in range(0, 1000): datas = datas + i + j + tend_time = time.time()print(datas)print(end_time-start_time)
对这段代码可以说是非常熟悉了吧,我们给出了多套优化方案,介绍完pandas之后我们对python的包有了一个基本的认知,基于python现成的包我们再做一次优化,用到的函数即为:reduce。
在进行for循环优化过程中主要方法有两个:一个是apply,一个是reduce。应用场景也有两个:
1)reduce对应的是跨行计算,即第一行的计算结果会叠加到第二行,计算完成后再叠加到第三行,以此循环;
2)apply对应的是单行计算,即第一行计算后返回一个值,第二行计算后返回一个值,各行之间互不干扰。
reduce方法
![1799de855d26bc1de742d7c808c6c937.gif](https://i-blog.csdnimg.cn/blog_migrate/8080989935e27b70946ea07cc569ce43.gif)
![cffe6acf09d4ec059c2df6d98a770a7f.png](https://i-blog.csdnimg.cn/blog_migrate/75ea23809c57c623aa850a6b67c54e04.png)
针对上文的代码,我们用reduce方法优化可以得到如下代码:
import timeimport numpy as npfrom functools import reducedata = 0start_times = time.time()data = reduce(lambda x, y: x + y, np.arange(1000))data1 = reduce(lambda x, y: x + (1000*y + data), np.arange(1000)) + datadata2 = reduce(lambda x, y: x + (1000000*y + data1), np.arange(1000)) + data1end_times = time.time()print(data2)print(end_times - start_times)
有没有感觉很简洁,主代码只有三行,而且没有嵌套存在,对应的运算结果如下:
时间上确实有所提高,同时代码的简洁程度也提高不少,代码优化到这里有没有感觉小有成就?
我想是有的~
除了reduce,其他函数有没有新的优化方法,肯定是有