中枪了?六种让你的python程序变慢的坏习惯(代码片段)

Python学习与数据挖掘 Python学习与数据挖掘     2023-01-01     501

关键词:

欢迎关注 ,专注Python、数据分析、数据挖掘、好玩工具!

随着 Python 越来越流行,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 中更优雅,而且性能更好。

较慢的示例

更快的例子

小结

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


技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、发送如下图片至微信,长按识别,后台回复:加群;
方式②、添加微信号:pythoner666,备注:来自CSDN
方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

这些设计坏习惯,你中枪了吗

规则就是用来打破的?这完全取决于规则本身。在移动UI设计的世界里,大家对美学、手势和动效的看法略有不同。有时一个简单的功能性应用比华丽的应用带来的效果更好,而有时候却恰恰相反。 不过,有些基本规则是人们不... 查看详情

朋友圈营销中的7大核心错误你中枪了吗

1.你的朋友圈里分享的全是广告砰!中枪了吗?这是80%微商犯的第一个错误就是,朋友圈里都是广告。产品、找代理、团队培训、收入截图、转账截图、发货......一照面就觉得你很讨厌,只要一接触你就知道你要卖东西给我,就像... 查看详情

女性求职常犯错误你中枪了吗?

  在郴州找工作的求职群中,女性也占据了主要地位。但是,女性在这个社会上貌似不是那么好找工作。在女性的观念里,她们往往很容易地认为她们的成就和技术不如男人,她们常常没有足够的信心来相信和认知自己的能力... 查看详情

对可用性测试的8种误解,你中枪了吗

用户测试是理解用户行为和动机的过程。好的设计能让用户轻松找到想看的,轻松做到想做的。 然而很多时候,由于时间和预算的限制,用户测试被边缘化、甚至直接被略过了。究其根本,还是在于用户测试的价值被误解和... 查看详情

虹奥财富帮你梳理理财中的10种低情商行为你中枪了吗?

  有人说,投资理财是一种理智的行为,看的主要是投资人的智商,但虹奥财富小编觉得,其实情商在投资中的影响更大。教育程度差不多的两个人,有一个对数字反应更快,按说应该更聪明,但他的投资收益却未必比反应慢... 查看详情

101种让你的网站更棒的方法

这篇文章最初出版于AwesomeBlog。 上周我和一个老客户聊天,她和我说,“Nick,我觉得我的网站需要改进,但是我却不确定到底需要做什么”。于是我就去问了周围很多人,朋友、家人和一些非互联网方向的商务人士。他们都... 查看详情

Python重音坟墓的坏习惯?

】Python重音坟墓的坏习惯?【英文标题】:Pythonaccentgravesbadpractice?【发布时间】:2012-10-0114:14:15【问题描述】:我最近了解到,我们可以在Python中使用以下代码作为repr(x)的简写:`x`但是,我在实践中很少看到这种情况。它被认... 查看详情

使用 Runnable 作为回调/子程序的坏习惯?

】使用Runnable作为回调/子程序的坏习惯?【英文标题】:BadpracticetouseRunnableascallback/subroutine?【发布时间】:2014-05-0813:12:43【问题描述】:使用Runnable作为回调是否被认为是不好的做法?考虑到Runnable旨在与线程一起使用(请参阅... 查看详情

摒弃这18个python坏习惯,让你的代码好用到起飞(代码片段)

大家好,今天给大家分享18个Python初学者常有的坏习惯,这些坏习惯不仅影响Python代码的可读性,而且影响Python的运行性能。摒弃这些坏习惯并以Pythonic的方式编写代码,提高的不仅仅是你的代码质量,也给阅... 查看详情

与理解相比,Python 3.5 与 3.6 使“地图”变慢的原因

】与理解相比,Python3.5与3.6使“地图”变慢的原因【英文标题】:Python3.5vs.3.6whatmade"map"slowercomparedtocomprehensions【发布时间】:2018-01-1723:48:09【问题描述】:如果有一个用C语言编写的函数/方法来获得额外的性能,我有时... 查看详情

阅读思考——被误用的敏捷和阻碍程序员成长的坏习惯

极限编程创始人RonJeffries建议开发者放弃敏捷确实现在很多公司都在误用敏捷,盲目的推进项目的进度,拍脑袋定个乐观的项目进度,然后让开发在指定时间点交东西,最后开发被迫加班。然后项目出问题,市场推卸责任给产品... 查看详情

一行代码让你的python运行速度提高100倍(代码片段)

python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。“一行代码让python的运行速度提高100倍”这绝不是哗众取宠的论调。我们来看一下这个最简单的例子,从1一... 查看详情

因为这几个typescript代码的坏习惯,同事被罚了500块

作者:DanielBartholomae翻译:疯狂的技术宅原文链接:https://startup-cto.net/10-ba...近几年TypeScript和JavaScript一直在稳步发展。我们在过去写代码时养成了一些习惯,而有些习惯却没有什么意义。以下是我们都应该改正的10个坏习惯。1.... 查看详情

让你的javascript计算性能提升70%

   现在的JavaScript代码要进行性能优化,通常使用一些常规手段,如:延迟执行、预处理、setTimeout等异步方式避免处理主线程,高大上一点的会使用WebWorker。即使对于WebWorker也仅仅是解决了阻塞主线程的问题,但是对于Java... 查看详情

保留“自我”的坏习惯?

】保留“自我”的坏习惯?【英文标题】:Bad-practicetoretain\'self\'?【发布时间】:2010-10-1713:36:06【问题描述】:我有一个简单的问题想请人解决……保留自己是不是不好的做法?我想要创建一个服务器请求对象。我希望能够以下... 查看详情

Full GC后socket连接变慢的原因是啥?

...5-08-0113:21:26【问题描述】:我们有一个客户端服务器应用程序,1个服务器,大约10个客户端。它们使用自定义查询通过tcp套接字进行通信。系统已经平稳运行了好几个月,但是在某个时间点,在每天约50秒的预定 查看详情

在异步操作完成之前从方法返回的坏习惯?

】在异步操作完成之前从方法返回的坏习惯?【英文标题】:Badpracticetoreturnfrommethodbeforeasyncoperationcompletes?【发布时间】:2016-07-2505:45:53【问题描述】:我有一个WebAPI2端点,我想在检索和验证用户时异步执行操作。如果此用户不... 查看详情

关于windows系统不会变慢的设想

...本,先启动SQLserver服务,等等。脚本的内容一般是先启动程序所需要的依赖项,最后再启动软件。然后手动创建结束的脚本。许多软件关闭后,会在后台有进程,或者服务未关闭,我们可 查看详情