

刷新认知!这六种让 Python 程序变慢的坏习惯我一直在用!
source link: https://developer.51cto.com/article/701659.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在本文中,我总结了 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 中更优雅,而且性能更好。
较慢的示例
更快的例子
Recommend
-
66
刷新了老师认知的请假理由
-
32
来源:学术经纬说到病毒,很多人的第一印象是对人体健康有百害而无一利。随着宫颈癌疫苗的普及,越来越多的人开始了解,病毒感染还会引起可怕的癌症。除了宫颈癌疫苗针对的人乳头状瘤病毒(HPV)外,还有一些常见病毒也是潜在的致癌因子,比如乙型肝炎病毒
-
5
美国在疫情中的表现,不断刷新我的认知人力资源(HR)话题下的优秀回答者美国的表现,不断刷新我的认知。早期,我觉得美国的问题在意识形态偏见早期美国...
-
9
刷新一下对于「直播」的认知 作者: 传播体...
-
6
1 简介 在日常运行程序的过程中常常涉及到**「循环迭代」过程,对于执行时间很短的程序来说倒无所谓,但对于运行过程有明显耗时的涉及「循环迭代」的程序,为其加上「进度条」**(progress bar)...
-
4
刷新认知,现在的女人为了变美太舍得了吧lwfairy(20级)楼主2022-02-03 23:55:34...
-
4
苹果 Mac Studio,再次刷新我们对个人电脑的认知 由两块 M1 Max 组成的 M1 Ultra,成为了 M1 系列的最后一块拼图,并完成了整个 M1 SoC 宇宙。
-
5
这支环保时装广告,刷新了认知! 作者: Emily ...
-
6
好电视的画质是你想不到的!TCL X11刷新普通人的画质认知-品玩 业界动态 好电视的画质是你想不到的!TCL X11刷新普通人的画质认知
-
15
pagecache如何让cpu密集程序变慢 问题的现象:业务的某些实例运行(在k8s中)缓慢(把实例中的程序记作ffm),即使运行 ffm -v(查看版本) 都很慢。 1 耗时分析
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK