资讯专栏INFORMATION COLUMN

独家 | 6种让Python程序变慢的坏习惯

xcc3641 / 3051人阅读

摘要:假设我们需要在程序中计算一些数字的平方根。此外如果我们需要在程序中多次使用平方根函数,代码将会更整洁。然而在这个虚构的例子中,只有的年龄超过岁。然后检查这三个人的年龄是否满足第二个条件。

作者: Christopher Tao翻译:王可汗校对:王雨桐本文约1800字,建议阅读5分钟本文总结了Python代码中经常被忽略的影响代码的运行速度常见问题。

随着Python的流行,用户数量也在增加。Python确实相对容易上手,也非常灵活,因此有更多可能的方式来实现一个函数。

当有多种方法可以实现一件特定的事情时,这意味着每种方法都有优缺点。在本文中,我收集了6种编写Python代码的典型方法,这些方法可能导致相对较差的性能。

一、不导入根模块

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

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

低效率示范:

在这个错误的示例中,我们导入了math模块,并使用math.sqrt()访问该函数。当然它可以运行,但是如果我们直接导入sqrt()函数,性能会更好。

高效率示范:

这比原来的快了25%。此外如果我们需要在程序中多次使用平方根函数,代码将会更整洁。

二、避免使用点/点链接

在Python中访问对象的属性或函数时,使用.是非常直观的。这种方法大多数时候都没有问题。然而如果我们能够避免使用点或点链接,那么性能便会变得更好。

低效率例子:

高效率例子:

如果你不相信它能起到同样的作用,我们可以验证一下。

注意:我可以预料到许多Python开发人员会跳出来说,这个例子中的技术有点可笑。事实上即使是我自己,也很少像上面那样写代码。然而我们应该知道怎样的代码是更高效的,可以使实现更快。

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

三、不使用+连接字符串

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

低效率例子:

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

高效率例子:

然而当我们使用join()函数时,该函数事先知道所有子字符串,并根据最终的字符串长度分配内存地址。因此省去了为每个子字符串分配内存的开销。

注意点:强烈建议尽可能多地使用join()函数。然而,有时我们可能只想连接两个字符串。或者只是为了方便起见,我们想使用“+”。在这些情况下,使用“+”号可以获得更好的可读性和更短的代码长度。

四、不使用临时变量进行值交换

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

低效率示范:

很明显我们需要一个临时变量作为过渡。当变量b的值被传递给变量a时,它用于保存变量a的值,然后a的值可以被赋给变量b。

高效率示范:

然而在Python中,我们不需要使用临时变量。Python有如下内置语法来实现这个值交换。这不仅提升了效率,而且使代码更加整洁。

五、在if条件下使用短路逻辑(short-circuit)

短路计算在许多编程语言中都存在,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岁。

因此如果我们先写出检查名字的条件,则满足了3个名字(Chris, Chelsea, Carol)。然后检查这三个人的年龄是否满足第二个条件。

但是由于短路逻辑,如果我们先写年龄条件,只有Chris的年龄在30岁以上,我们会再次检查他的名字是否以“C”开头。

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

六、如果可以使用for循环,就不要使用while循环

Python使用大量C语言来提高性能,即CPython。在循环语句方面,与while循环相比,Python中的for循环有相对较少的步骤,而更多的步骤是作为C代码运行的。

因此当我们可以在Python中使用for循环时,尽量避免使用while循环。这不仅是因为在Python中for循环更优雅,而且性能更好。

低效率示范:

高效率示范:

总结

在本文中,我列出了6个可以使Python程序更快的技巧。但是我们也需要特别注意的是,我们不应该总是把性能放在第一位。有时可读性和简洁性也应该考虑在内,这一切最重要的是平衡。

原文标题:

Six Bad Manners that Make YourPython Program Slower

原文链接:

https://towardsdatascience.com/6-bad-manners-makes-your-python-program-slower-15b6fce62927

编辑:黄继彦

译者简介

王可汗,清华大学机械工程系直博生在读。曾经有着物理专业的知识背景,研究生期间对数据科学产生浓厚兴趣,对机器学习AI充满好奇。期待着在科研道路上,人工智能与机械工程、计算物理碰撞出别样的火花。希望结交朋友分享更多数据科学的故事,用数据科学的思维看待世界。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121153.html

相关文章

  • SQL查询慢的原因及50条优化方法总结

    摘要:没有创建计算列导致查询不优化。配置虚拟内存虚拟内存大小应基于计算机上并发运行的服务进行配置。运行时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的倍。用查询优化器可见到差别。一、查询速度慢的原因很多,我总结SQL查询慢的10个原因:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有创建计算列导致查询不优化。  ...

    Tecode 评论0 收藏0
  • 我的前端编码习惯 —— js篇

    摘要:文件中的代码块可用以下代码块包裹,以减少全局污染。命名规则原则尽量避免潜在命名冲突,避免过于精简,应见名知意。必须与共同使用的构造函数名应以大写字母开头。变量所有的变量必须在使用前进行声明。仅在函数和构造器内使,以明确的上下指向。 代码格式规范 1.html中外部脚本引入尽量放在尾部。 2.一个html文件中只写一个代码块。 3.JS文件中的代码块可用以下代码块包裹,以减少全局污染。 ...

    LancerComet 评论0 收藏0

发表评论

0条评论

xcc3641

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<