当前位置: 首页 > 科技观察

刷新认知!这6个让我一直使用的Python程序变慢的坏习惯!

时间:2023-03-15 23:51:40 科技观察

在本文中,我总结了6个如何编写Python的示例。1.不要导入根模块使用Python时我们无法避免的一件事就是导入模块,无论是内置模块还是第三方模块。有时,我们可能只需要该模块中的一个或几个函数或对象。在这种情况下,我们应该尽量只导入我们需要的函数或对象,而不是导入根模块。这是一个简单的例子。假设我们需要在我们的程序中计算一些数字的平方根。较慢的示例在坏示例中,我们导入数学模块并使用math.sqrt()来访问该函数。当然,这没什么问题,但如果我们能引入sqrt()函数,性能会更好。更快的示例2.避免使用点/点链使用点非常直观。在Python中访问对象的属性或函数。大多数时候,没问题。但是,如果我们可以避免使用点甚至链接点,性能实际上会更好。下面的示例显示了将数字附加到列表然后删除它们。SlowerexampleFasterexample如果你不相信这实际上做了同样的事情,我们可以验证它。我可以预料到许多Python开发人员会出来说这个例子中的技术有点荒谬。其实就算是我自己,也很少会写出像上面这样的代码。然而,很高兴知道我们可以用这种方式编程,甚至可以让它更快。如果我们想要数百万次地添加和删除列表中的项目,我们可能应该考虑使用这个技巧。这就是为什么我们需要平衡代码的性能和可读性。3.不要使用+来连接字符串字符串在Python中是不可变的。所以当我们用“+”将多个字符串拼接成一个长字符串时,每个子字符串都是单独操作的。较慢的示例具体来说,对于每个子字符串,它需要请求一个内存地址,然后将其与该内存地址处的原始字符串连接起来,这成为一种开销。更快的示例然而,当我们使用join()函数时,该函数预先知道所有子字符串,并且内存地址分配的长度适合最终连接的字符串。因此,没有为每个子串分配内存的开销。强烈建议尽可能使用join()函数。然而,有时我们可能只想连接两个字符串。或者,为了方便,我们要使用“+”。在这些情况下,使用“+”符号会带来更好的可读性和更短的代码长度。4.不要使用临时变量进行值交换许多算法需要两个变量的值交换。在大多数其他编程语言中,这通常是通过引入一个临时变量来完成的,如下所示。较慢的示例较快的示例然而,在Python中我们不必使用临时变量。Python有内置的语法来实现这种价值交换,如下所示。5.使用If条件进行短路“短路”评估存在于许多编程语言中,Python也是如此。基本上,它指的是某些布尔运算符的行为,其中仅在第一个参数不足以确定整个表达式的值时才执行或评估第二个参数。让我们用一个例子来证明这一点。假设我们有一个列表如下。my_dict=[{'name':'Alice','age':28},{'name':'Bob','age':23},{'name':'Chris','age':33},{'name':'Chelsea','age':2},{'name':'Carol','age':24}]我们的工作是过滤列表以找到所有以“C”开头的名字一开始,30岁以上的人。较慢的例子有两个条件需要同时满足:name以“C”开头age≥30所以,我们可以这样写代码。更快的示例前面示例中的代码没有任何问题。然而,在这个特定的虚构示例中,只有“克里斯”超过30岁。如果我们首先编写检查姓名的条件,则满足三个姓名(Chris、Chelsea和Carol)。然后,再次检查所有3个人的第二个年龄条件。但是因为短路求值,如果我们先写年龄条件,只有Chris的年龄超过30岁,它会再次检查他的名字是否以“C”开头。在这种情况下,它几乎快了100%。6.如果可以使用For循环,就不要使用While循环。Python大量使用C来提高性能,即CPython。在循环语句方面,Python中的For-Loop的步骤相对较少,更多的是作为C代码运行的,而不是While-Loop。所以在Python中可以使用For循环的时候,我们不应该使用while循环。For-Loop在Python中不仅更优雅,而且性能更高。较慢的例子较快的例子