Python程序提速的几个技巧

北京治疗白癜风医院那里好 https://baijiahao.baidu.com/s?id=1680518420286668560&wfr=spider&for=pc

大家好,我是TT。

在我们开始优化任何东西之前,我们首先需要找出到底是代码的哪些部分减慢了整个程序,有时程序的瓶颈可能是显而易见的,但如果你不知道它在哪里,那么以下选项可以帮你找出来。

这是一段用于演示的程序,它是用于计算e的X次方,首先是最简单同时又非常懒惰的解决方案:使用Unixtime命令。

如果你只是想计算整个过程的运行时间只需要这样做就行了。但这通常不能满足我们的需求,所以另一个极端就是cProfile,但是它提供的信息又太多了,在这里我们使用cProfile模块和time参数运行测试脚本,这样就可以根据内部时间cumtime对代码进行排序。这给了我们很多信息,这里的内容大约是实际输出的10%,我们可以看到exp函数是罪魁祸首。

现在我们可以得到更具体的时间和性能分析,现在我们知道了应该将注意力放在哪里,如果我们希望对慢速函数进行计时而不需要测量代码的其余部分,就可以使用简单的装饰器。

接下来,把这个装饰器应用到函数上,然后进行输出,得到这样的结果。

这里需要考虑一件事是我们实际想测量的是哪种时间,时间包提供了time.perf_counter和time.process_time,它们的不同之处在于perf_counter返回绝对值。

其中包括python程序进程不运行时的时间,因此可能会受到机器负载的影响,另一方面,process_time只返回用户时间而不包括系统时间,只是进程的时间,那么有趣的部分来了,让我们将你的python程序运行得更快一些吧。

需要注意的是,这里不会向你展示骇客技术、技巧和代码,更多介绍的是一般的想法和策略,当你使用它时,会对性能产生巨大的影响,在某些情况下可以提高30%的速度。

第一点:使用内置数据类型

内置数据类型非常快,特别是与树或链表等自定义类型相比,这主要是因为内置类型是用C实现的,在python编码时,我们无法在速度上与之匹配。

第二点:使用lru_cache缓存数据

这里通过一个简单的例子说明一下,这里的函数使用time.sleep模拟大量计算,第一次使用参数1调用时它将等待2秒然后才返回结果。当再次调用时结果已经被缓存,因此它会跳过函数体并立即返回结果。

第三点:使用局部变量

这与在每个作用域内查找变量的速度有关,在这里,写每个作用域是因为它不只关乎是使用局部变量还是全局变量,查找速度也存在着差异,在函数中的局部变量最快,类级属性次之,而全局变量最慢,你可以像这样,使用不必要的赋值来提升性能。

第四点:使用函数

这看起来可能不符合直觉,因为调用函数将更多的东西放到堆栈中,从函数返回时会产生开销,但这与前面一点有关,如果你只是将整个代码放入一个文件中而不将其放入函数中,那么由于全局变量的关系速度会慢很多,因此你只是将整个代码封装在main函数中并调用一次就可以加快代码。

第五点:不要访问属性

另一个可能降低程序速度的是操作符(.),这个操作符使用_getattribute_触发字典查找,这会在代码中产生额外的开销。

第六点:提防字符串

在循环中运行诸如模数(%s)或.format()之类的方法时,对字符串的操作可能会变得非常慢,根据RaymondHettinger的推文,我们唯一应该使用的是f-string,它是最易读、最简洁、最快速的方法。因此,你可以使用这个方法让速度变快,生成器本身并没有更快,因为它们允许延迟计算,这里节省的是内存而不是时间,但是节省的内存可能会使得程序在实际运行时更快。

如果你有一个大型数据集并且没有使用生成器或者说是迭代器,那么数据可能会溢出CPUL1缓存,这将显著降低在内存中查找值的速度,说到性能,很重要的一点就是CPU可以将它正在处理的所有数据保存在缓存中,关于这个问题你如果感兴趣的话也可以看一下RaymoudHettingers的演讲。

总之,优化的第一原则是不做优化,但如果你真的需要,希望这些小技巧能帮助到你,不过在优化代码时要万分小心,因为它可能会使代码难于阅读,难于维护,甚至超过优化带来的好处,如果你有更好的方法欢迎在评论区留言讨论。




转载请注明:http://www.aierlanlan.com/cyrz/782.html