6种让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程序更快的技巧。但是我们也需要特别注意的是,我们不应该总是把性能放在第一位。有时可读性和简洁性也应该考虑在内,这一切最重要的是平衡。
https://www.ixiera.com
一组图片,带你走进古老而又神秘的布达拉宫布达拉宫,世界屋脊上的明珠,始建于公元7世纪,成为当时吐蕃王朝统一的政治中心。它位于拉萨市区西北玛布日山上,是世界上海拔最高的集宫殿城堡寺院于一体完整的古代宫堡建筑群。据说最初是吐
西藏5大赏花名地1波密桃花沟3月上旬到3月底,持续约20天坐拥十万株野生桃树的波密桃花沟就获得中国最大桃花谷的吉尼斯记录认证2。林芝市嘎拉桃花村3月中旬到4月上旬,持续时间约25天三面环山,面朝尼
北京一定要去的寺庙,位于群山怀抱之中,深受游客的喜爱北京一定要去的寺庙,位于群山怀抱之中,深受游客的喜爱提起北京市,人们都会想到就是中国的首都,是中国的政治与经济中心,在北京还有这许多著名的人文景观以及出色的自然美景,这就吸引了许多
北京什刹海游船开航,前海后海7个码头投入使用什刹海游船经过相关职能部门的联合检验合格,达到北京地区疫情防控各项要求,在清明假期前夕正式对外营业。开航前,在什刹海游船码头,工作人员对游船进行了消杀,并检查游船设施,做好各项开航
美国女子每月打飞的前往迪士尼,资金不够还去捐血换报酬美国费城有一名28岁的女子,叫利兹格拉姆里奇,该国疫情发生后,机票价格下跌,她每月坐飞机去迪士尼乐园旅行。后来机票价格慢慢回涨,她负担不起了,还通过捐血获得报酬,以支付游玩花费。(
美丽的梅河口市,善良的梅河人我对梅河口市印象一直很好,这座城市山青水秀,人杰地灵。梅河口人务实,善良,最可贵的是清纯,清纯的如辉发河流淌着的水。大姨家居梅河,小时候一到寒暑假就到大姨家玩,在那里过了好几个春节
鲜美花凉湖胖头鱼花凉湖位于安徽省太湖县境内,是国内4A级景区,湖内岛屿星罗棋布,众多岛屿使湖岸曲折离奇,一年四季风光迷人,宛如人间仙境。花凉湖湖水是国家一级水资源,优质的水资源富养着一种让人陶醉的
陕钢龙钢工业文旅是选择更是机遇新时代下,我国产业边界的快速消失,促使产业融合已经成为经济领域的普遍现象。产业融合打破了产业壁垒,不仅能够催生新产品,拓宽新市场,最终还能够实现产业整合,对经济增长战略革新都有不可
20岁不到骑行一万多公里我好像生来就是为了在路上她很少纠结自己到底是哪类人,对旅途的渴望和对物质的低需求让她早早走在了路上。她的经历不值得普通人效仿,但看过她的故事后会让人知道哦,原来世界上真的有人在为了自己的意志活着呀!不一样
池塘往事荷叶伞遮急雨,莲花在午风中宁静绽放自从发现长江干流原来如此混浊,心中的江南更多地变成了这个样子外围是蜿蜒而过的中等河流,内侧则是长有荷叶荷花的池塘。图一荷叶轻轻摇曳,莲花宁静绽放,这是江南田野深处最美的风景。在蓝色
旅游景区解说服务规范拟新增解说服务认证北京商报讯(记者关子辰吴其芸)5月18日,全国旅游标准化技术委员会对其发布的旅游景区解说服务规范(修订稿)(以下简称规范)公开征求意见。规范规定了旅游景区人员解说服务电子解说服务解