刷新认知!这六种让 Python 程序变慢的坏习惯我一直在用!

开发 前端
我们知道 Python 是一门非常流行的开发语言,它语言简洁并且容易学习,一个功能可能有多种实现方式。只要有多种方法做一件特定的事情,那就意味着每种方法都性能的差异。

在本文中,我总结了 6 种 Python 编写方式案例。

1.不要导入根模块

在使用 Python 时,我们无法避免的一件事是导入模块,无论是内置模块还是第三方模块。有时,我们可能只需要该模块中的一个或几个函数或对象。在这种情况下,我们应该尝试只导入我们需要的函数或对象,而不是导入根模块。

这是一个简单的例子。假设我们需要计算程序中某些数字的平方根。

较慢的示例

在不好的例子中,我们导入了 math 模块,并使用 math.sqrt() 来访问该函数。当然,它没有任何问题,但如果我们可以导入 sqrt() 函数,性能会更好。

更快的例子

2.避免使用点/点链

使用 dot 非常直观。在 Python 中访问对象的属性或函数。大多数时候,没有问题。但是,如果我们可以避免使用点甚至链接点,性能实际上会更好。

下面的示例显示将数字附加到列表中,然后将其删除。

较慢的示例

更快的例子

如果你不相信这实际上做同样的事情,我们可以验证它。

我可以预料到许多 Python 开发人员会跳出来说这个例子中的技术有点荒谬。事实上,即使是我自己,我也很少像上面那样写代码。然而,很高兴知道我们可以这样编程,甚至可以让它更快。

如果我们想附加到一个列表并从中删除数百万次的项目,我们可能应该考虑使用这个技巧。这就是为什么我们需要平衡代码的性能和可读性。

3.不要使用 + 连接字符串

字符串在 Python 中是不可变的。因此,当我们使用"+"将多个字符串连接成一个长字符串时,每个子字符串都是单独操作的。

较慢的示例

具体来说,对于每个子字符串,它需要请求一个内存地址,然后将它与该内存地址中的原始字符串连接起来,这成为一种开销。

更快的例子

但是,当我们使用 join() 函数时,该函数事先知道所有子字符串,并且内存地址分配的长度适合最终连接的字符串。因此,没有为每个子串分配内存的开销。

强烈建议尽可能使用 join() 函数。但是,有时我们可能只想连接两个字符串。或者,只是为了方便起见,我们想使用“+”。在这些情况下,使用“+”号会带来更好的可读性和更少的代码长度。

4.不要使用临时变量进行价值交换

许多算法需要两个变量的值交换。在大多数其他编程语言中,这通常是通过引入一个临时变量来完成的,如下所示。

较慢的示例

更快的例子

但是,在 Python 中,我们不必使用 temp 变量。Python 具有内置语法来实现此值交换,如下所示。

5.使用 If-Condition 短路

"短路"评估存在于许多编程语言中,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岁的人。

较慢的示例

有两个条件都需要同时满足:

  • 名称以"C"开头
  • 年龄≥30 因此,我们可以编写如下代码。

更快的例子

前面例子中的代码没有任何问题。但是,在这个特殊的虚构示例中,只有"Chris"的年龄在 30 岁以上。

如果我们先写出检查名字的条件,那么满足三个名字(Chris、Chelsea 和 Carol)。然后,将针对所有这 3 个人再次检查有关年龄的第二个条件。

但是,因为短路评估,如果我们先写年龄条件,只有 Chris 的年龄在30岁以上,并且会再次检查他的名字是否以"C"开头。

在这种情况下,它几乎快了100%。

6.如果可以使用For循环就不要使用While循环

Python 使用了很多 C 来提高性能,即 CPython。在循环语句方面,Python 中的 For-Loop 具有相对较少的步骤,其中更多的步骤作为 C 代码运行,而不是 While-Loop。

因此,当我们可以在 Python 中使用 For-Loop 时,我们不应该使用 while 循环。这不仅是因为 For-Loop 在 Python 中更优雅,而且性能更好。

较慢的示例

更快的例子

责任编辑:华轩 来源: Python学习与数据挖掘
相关推荐

2019-11-28 18:51:07

PythonPHP编程语言

2019-12-03 13:16:55

PHP流封装协议

2012-05-18 00:01:07

JVMJavaJVM平台

2012-05-22 00:16:47

2009-07-21 14:32:02

IT人习惯

2011-05-30 14:50:56

程序员

2021-11-29 18:34:14

内存异步死循环

2021-11-01 22:39:14

程序员专业技术

2022-09-26 08:30:41

黑客网络攻击隐私

2009-05-21 09:28:05

阿里巴巴马云忽悠

2014-12-11 13:41:32

2018-01-11 13:57:36

程序员技能开发者

2017-07-06 11:08:12

开源云计算EasyStack

2013-01-22 11:57:29

IT工作者加班

2022-07-13 17:47:54

布局Flex代码

2011-06-21 17:24:10

2023-05-10 13:58:13

服务限流系统

2018-03-21 18:00:15

NestJS

2021-09-27 09:57:04

IBM工程师RustGRUB
点赞
收藏

51CTO技术栈公众号