【Python】七个提升Python代码性能的技巧

文摘   科技   2024-10-29 07:49   江苏  








01


引言





大家好,我是AI算法之道!


Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。


大家好!我想与大家分享一些提升Python性能的技巧,我觉得每个人都应该知道,因为我花了很多精力才学会了它。因此,这些技巧在我的项目中发挥了真正的作用。


闲话少说,我们直接开始吧!





02


使用生成器节省内存

有时候我们需要在项目中处理一大串元素?比如,数据库中的一百万条记录。很多时候,存储和重新获取所有这些内存对于我们的用例来说可能会非常耗费资源,这时我们可以使用生成器来帮助我们生成对应的元素,从而无需一次性加载所有内容。
常见写法:
data = [process(item) for item in big_list]
试试看如下写法:
def data_generator(big_list):    for item in big_list:        yield process(item)        for item in data_generator(big_list):    # Do something with item

我还记得第一次改用生成器时的感觉--就像变魔术一样。突然间,我的脚本不再占用全部内存,一切都运行得更顺畅了。




03


 使用内置函数


Python 的标准库就像一个百宝箱。map()、filter() 等函数,以及 itertools 和 collections 等模块都经过 C 语言优化,比自定义代码更快。
例如:
cubed = [x*x*x for x in my_list]
你可以替换为:
import itertoolscubed = map(lambda x: x*x*x, my_list)

当您处理的数据变得庞大时,大家将会真正感受到结果的差异,这将使大家在编写简洁、高效的代码时倍感舒适。

我以前总是避免使用内置函数,因为我觉得自己编写更酷。现在我意识到,代码少意味着错误少。你懂的!!!





04


 避免使用全局变量


需要了解的一个关键点是,局部变量要灵活得多,因为很难跟踪哪个模块在使用全局变量,这也给测试工作带来了一些困难。

例如,例子为:

counter = 0def increment():    global counter    counter += 1
我们可以尝试将变量作为参数传递:
def increment(counter):    return counter + 1counter = 0counter = increment(counter)
我知道,对于快速实现某项功能来说,全局变量是很诱人的,但在大型应用程序中,全局变量可能会成为性能瓶颈(和令人头痛的问题)。






05


合理使用列表生成式


列表生成式很简单,但可能会被过度使用。如果创建一个列表只是为了循环一次,可以考虑使用生成器。

比如:

results = [process(x) for x in data]for result in results:    # Do something

一种更好的替代方案为:

for result in (process(x) for x in data):    # Do something
这样就不会将整个result列表存储在内存中







06


快速查找元素


Python 中的集合和字典的平均查找时间为 O(1)。如果要检查某元素是否存在,它们比列表快得多。
列表查找时间复杂度为O(n) , 代码如下:
if item in my_list:    # Do something

推荐写法:

my_set = set(my_list)if item in my_set:    # Do something


我有一个脚本花了很长时间,将列表转换为集合后,运行时间从几分钟缩短为几秒钟。





07


快速查找元素


Python 中需要拼接字符串时,推荐使用join函数。因为在循环中使用 + 或 += 创建字符串可能会很慢,这是由于字符串是不可变的,每次连接都会创建一个新字符串。
一种不好的写法:
result = ''for s in strings:    result += s

推荐的写法为:
result = ''.join(strings)

相信我,这对大型字符串来说差别很大。









08


使用多重赋值


这是个小技巧,但很实用。Python 可以在没有临时变量的情况下交换变量,而且多重赋值速度更快。
一种不好的写法:
temp = aa = bb = temp

推荐的写法仅需:

a, b = b, a

同样,解包可以使代码更简洁、更快速:

data = (1, 2, 3)x, y, z = data









09


总结


这些是我多年来在犯了很多错误之后获得的一些总结我承认,每个项目都有些不同,你的解决方案确实要能解决你的问题,每当你面临某种瓶颈时,都要注意这些编码细节希望这些小技巧可以帮助到大家,提升大家的工作效率!


您学废了吗?






点击上方小卡片关注我




添加个人微信,进专属粉丝群!



AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章