为什么优化Python的代码?月薪25K的程序员用万字长文告诉你
了解优化的步骤
进群:125240963 即可获取数十套PDF哦1
本小节将简要介绍软件优化的步骤。
处理流程
下面的内容介绍了我们将要使用的代码优化步骤。
1.建立现有代码的基线性能(执行时间、内存消耗、峰值I/O带宽等)。
2.确定性能目标以及系统的上限。以终为始是高效能人士的七个习惯之一,优化也是同样的道理。代码需要执行多快?完成任务可接受的最长时间是多少?软件最大可以占用多少内存?计算结果需要多准确?结果需要怎样的保真度?
3.建立测试和度量环境,可以帮助你迅速测量相关的性能指标。如果能够更容易地度量每一行代码的性能,那么就可以更快地优化代码。如果度量的过程十分痛苦并且总要去记一些你会忘记的命令,优化的过程就会变得痛苦而缓慢。
4.记录当前代码的所有参数和状态快照。
5.利用剖析器寻找代码瓶颈。
6.从最主要的瓶颈入手来解决性能问题。鉴于代码的复杂度,每轮测试只解决一个问题是一种安全的方法。
7.利用剖析器分析修改后的代码,检查结果是否有变化。
8.跳回第4步,尽可能多地重复进行。
识别代码中常见性能瓶颈
在优化数据科学项目的过程中,查看整个分析过程、了解每个阶段所需要消耗的时间以及它们之间的关系是十分重要的。
让我们把问题简化成减少软件的执行时间,且只考虑使用一种特定的语言来实现这个软件。在这里,我们不考虑处理大数据集,也就是说,将数据规模从生产数据库规模降到简单分析用的数据。
从更抽象的层次来说,执行时间只和代码本身以及硬件条件相关。如果想要降低运行时间,要么修改代码,要么升级硬件,或者两者同时进行。
对于优化来说,我们必须时刻记住自己的目的是什么:必须达到何种程度的优化或者软件需要运行多快。
将运行时间降为原来的二分之一和降低一个数量级是两种完全不同的优化方式,通常后者需要代码发生根本性的变化。
cos:余弦sin:正弦tan:正切acos:反余弦asin:反正弦atan:反正切exp:幂运算pow:以10为底的对数ln:自然对数cosh:双曲余弦sinh:双曲正弦tanh:双曲正切acosh:反双曲余弦asinh:反双曲正弦atanh:反双曲正切
在编写计算复杂的代码时,大部分代码都写得很简单明了,使得作者可以一次就得到正确的结果。这就意味着可能会有一些不必要的复杂计算、速度慢的代码存在,尤其是在条件判断附近。如果你使用的是编译型语言,编译器可能会对代码进行重新排列,但是最好还是不要过于依赖它(动态语言和JVM上运行的语言,在运行期很难判断它们究竟会做什么)。
对于第六步,大部分数学表达式写出来都是给人看的,而不是为了让现代计算机软件和硬件可以很好地运行。简单修改一下等式,去除一些项或者改写一些项都会带来性能的提升。例如,将乘法转为加法,除法转为乘法。对于那些需要执行上亿的操作来说,这些小小的改动会带来时间上巨大的节省。加减预算要快于乘法,而乘法又要快于除法。
工作原理
asa.py的main()函数处理包含需要被分析的分子信息的文件及其他命令行参数。当利用 molecule.py中的方法导入分子结构后,再调用calculate_asa函数来处理之后的所有计算。
在文件的顶端,找到第一个函数generate_sphere_points(),这个函数可以计算在指定半径范围内的等距点的个数,并将等距点以三元组列表的形式返回。
代码中有一个遍历所有索引的循环。在循环内部,neighbor_indices变量随迭代不断增长,vector3d.py中的pos_distance函数不断被调用。在函数中,我们看到首先计算两点p1和p2的距离的平方,然后取平方根的操作,如下面的代码所示。
接下来进入第二层循环,遍历sphere_points中的每一个点。如果使用默认的960个节点,那么循环将有960次迭代。对于平面等距点结合中的每一个点,我们加入当前原子的中心坐标。
然后就是最内层循环,遍历所有的邻近原子。对于每个邻近原子,我们比较test_point到邻近原子中心的距离。如果两点之间在一个特定的距离内,我们就认为test_point不能被溶剂分子接触。
用另一种方式来解释,内部两层循环利用预先生成好的表面等距点生成测试原子。然后检查每个点,看看是否存在有一个邻近原子在指定的距离内。如果存在,那么表面上的这个点就被认为是不可被接触的。
原子的可接触区域即为被邻近节点所阻断的原子周围表面部分。
三层嵌套循环和大量的计算意味着有很大的性能提升空间。
了解数据科学的路径,并且帮助Mac、Windows和Linux操作系统的读者恰当地搭建数据科学环境。对汽车数据进行分析和可视化,从中发现不同时间燃料效率的变化趋势和模式。
模拟美式橄榄球比赛数据(R)
读者展示如何搭建自己的选股系统,并且使用移动平均法分析股票历史数据。
就业数据的可视化探索(R)。向读者展示如何从劳动统计局获取雇佣和收入数据,并且用R对不同水平的数据进行空间分析。
运用税务数据进行应用导向的数据分析(Python)。向读者展示如何使用Python将自己的分析从一次性临时的工作转变为可复用的产品化的代码。这些工作都是基于一份收入数据展开。
运用汽车数据进行可视化分析(Python)这里使用的是强大的编程语言Python。
社交网络分析(Python),向读者展示如何建立、可视化和分析社交网络。
大规模电影推荐(Python)。告诉你如何用Python搭建电影推荐系统。
获取和定位Twitter数据(Python)。向读者展示如何调用Twitter的API获取Twitter用户数据,并绘制用户信息中包含的地理信息数据。
利用NumPy和SciPy优化数值计算(Python)。带领读者领略如何优化Python代码,从而在处理大数据集时节省时间和金钱。
所以你懂了吗?