为什么优化Python的代码?月薪25K的程序员用万字长文告诉你!
了解优化的步骤 进群:125240963 ?即可获取数十套PDF哦1 本小节将简要介绍软件优化的步骤。 处理流程 下面的内容介绍了我们将要使用的代码优化步骤。 1.建立现有代码的基线性能(执行时间、内存消耗、峰值I/O带宽等)。 2.确定性能目标以及系统的上限。以终为始是高效能人士的七个习惯之一,优化也是同样的道理。代码需要执行多快?完成任务可接受的最长时间是多少?软件最大可以占用多少内存?计算结果需要多准确?结果需要怎样的保真度? 3.建立测试和度量环境,可以帮助你迅速测量相关的性能指标。如果能够更容易地度量每一行代码的性能,那么就可以更快地优化代码。如果度量的过程十分痛苦并且总要去记一些你会忘记的命令,优化的过程就会变得痛苦而缓慢。 4.记录当前代码的所有参数和状态快照。 5.利用剖析器寻找代码瓶颈。 6.从最主要的瓶颈入手来解决性能问题。鉴于代码的复杂度,每轮测试只解决一个问题是一种安全的方法。 7.利用剖析器分析修改后的代码,检查结果是否有变化。 8.跳回第4步,尽可能多地重复进行。 识别代码中常见性能瓶颈 在优化数据科学项目的过程中,查看整个分析过程、了解每个阶段所需要消耗的时间以及它们之间的关系是十分重要的。 让我们把问题简化成减少软件的执行时间,且只考虑使用一种特定的语言来实现这个软件。在这里,我们不考虑处理大数据集,也就是说,将数据规模从生产数据库规模降到简单分析用的数据。 从更抽象的层次来说,执行时间只和代码本身以及硬件条件相关。如果想要降低运行时间,要么修改代码,要么升级硬件,或者两者同时进行。 对于优化来说,我们必须时刻记住自己的目的是什么:必须达到何种程度的优化或者软件需要运行多快。 将运行时间降为原来的二分之一和降低一个数量级是两种完全不同的优化方式,通常后者需要代码发生根本性的变化。
在编写计算复杂的代码时,大部分代码都写得很简单明了,使得作者可以一次就得到正确的结果。这就意味着可能会有一些不必要的复杂计算、速度慢的代码存在,尤其是在条件判断附近。如果你使用的是编译型语言,编译器可能会对代码进行重新排列,但是最好还是不要过于依赖它(动态语言和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不能被溶剂分子接触。 用另一种方式来解释,内部两层循环利用预先生成好的表面等距点生成测试原子。然后检查每个点,看看是否存在有一个邻近原子在指定的距离内。如果存在,那么表面上的这个点就被认为是不可被接触的。 原子的可接触区域即为被邻近节点所阻断的原子周围表面部分。 三层嵌套循环和大量的计算意味着有很大的性能提升空间。
所以你懂了吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |