QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2286|回复: 0
打印 上一主题 下一主题

来看看这六种让你的 Python 程序变慢的坏习惯,你有没有中枪

[复制链接]
字体大小: 正常 放大

889

主题

63

听众

17万

积分

  • TA的每日心情
    开心
    2023-3-15 17:49
  • 签到天数: 224 天

    [LV.7]常住居民III

    社区QQ达人 邮箱绑定达人 元老勋章 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    跳转到指定楼层
    1#
    发表于 2021-11-10 11:59 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    随着 Python 越来越流行,Python 用户的数量也在增加。Python确实比较容易学。它也非常灵活,因此有更多可能的方法来实现一个功能。

    然而,只要有多种方法可以做一件特定的事情,就一定意味着每种方法都有优点和缺点。在本文中,我收集了 6 种可能导致性能相对较差的 Python 代码编写典型方式。

    1.不要导入根模块

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

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

    较慢的示例 1.png

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

    更快的例子 2.png
    2.避免使用点/点链

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

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

    较慢的示例 3.png
    更快的例子 4.png

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

    5.png

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

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

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

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

    较慢的示例

    6.png

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

    更快的例子

    7.png


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

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

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

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

    较慢的示例 8.png
    更快的例子

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

    9.png
    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 因此,我们可以编写如下代码。
    • 10.png
    更快的例子

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

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

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


    11.png


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

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

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

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

    较慢的示例 12.png
    更快的例子 13.png
    小结

    在本文中,我列出了 6 个让 Python 程序更快的技巧。但是,也需要密切注意,不要总是把性能放在第一位。有时,还应考虑可读性和简洁性。



    1.png (33.76 KB, 下载次数: 252)

    1.png

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-4-26 15:27 , Processed in 0.304480 second(s), 54 queries .

    回顶部