通过学习这些技巧,让你的Python代码更加简洁和高效

文章介绍了Python编程中关于列表性能的陷阱,如插入操作效率低下的解决方案(使用deque替代),以及成员查找和字典合并的高效方法。作者还分享了学习Python的资源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

今天看到一些关于容器的使用技巧,这里分享给大家,一起提高python编程能力

列表性能陷阱

陷阱一

列表中插入数据,我们通常使用append()方法在尾部追加,也可以使用insert()在任意位置插入。但是当数据量比较大时,有些操作会变的很慢。我们测验一下

def list_append():
    """不断往尾部追加"""
    l = []
    for i in range(5000):
        l.append(i)
​
​
def list_insert():
    """不断往头部插入"""
    l = []
    for i in range(5000):
        l.insert(0, i)

使用timeit模块进行测试,

import timeit
​
append_spent = timeit.timeit(list_append, number=1000)
print("list_append:", append_spent) # list_append: 0.30923892399999997
​
insert_spent = timeit.timeit(list_insert, number=1000)
print("list_insert", insert_spent) # list_insert 5.752398332

通过结果,可以看到,list_append和list_insert两个函数都是构建长度为5000的列表,list_insert比list_append耗时多达18倍。这是因为,列表的底层是数组,在数组中间插入成员时,这个成员之后的成员都需要移动位置,这个操作的平均时间复杂度是O(n),而在尾部插入,这个操作的平均时间复杂度是O(1)。

那如何解决该性能问题呢?

我们可以使用collections.deque来代替列表,像这样

from collections import deque
​
​
def deque_append():
    """不断往尾部追加"""
    l = deque()
    for i in range(5000):
        l.append(i)
​
​
def deque_insert():
    """不断往头部插入"""
    l = deque()
    for i in range(5000):
        l.insert(0, i)

我们使用deque实现了同样的逻辑,我们再来测试一下

import timeit
​
​
append_spent = timeit.timeit(deque_append, number=1000)
print("deque_append:", append_spent) # deque_append: 0.300922523
​
insert_spent = timeit.timeit(deque_insert, number=1000)
print("deque_insert", insert_spent) # deque_insert 0.47996506299999997

通过结果可以看到,使用deque,不论从尾部还是从头部追加成员都非常快。

陷阱二

判断成员是否在列表中存在,像这样

nums = list(range(1000000))
def is_True():
    return 1000000 in nums

我们还是使用timeit来测试一下

import timeit
​
​
spent = timeit.timeit(is_True, number=1000)
print("is_True:", spent) # is_True: 10.706976014

可以看到耗时很长,这是因为,判断某个成员是否存在,只能从前往后遍历所有成员,这个操作的平均时间复杂度是O(n)。

那该如何解决该性能问题吗?

可以考虑将列表转换成集合类型,像这样

nums = list(range(1000000))
nums_set = set(nums)
def is_True():
    return 1000000 in nums_set

我们再测试一下,

import timeit
​
​
spent = timeit.timeit(is_True, number=1000)
print("is_True:", spent) # is_True: 0.00022141500000000258

可以看到速度很快,这是因为,在集合底层使用了哈希表数据结构,判断某个成员是否存在,只需算出该成员的哈希值,然后去哈希表对应位置检查obj是否存在就可以了,这个操作的平均时间复杂度是O(1)

快速合并字典

提到合并字典,我们想到最简单的方法,就是使用update方法

d1 = {"name": "honey"}
d2 = {"age": 18}
d1.update(d2)
print(d1) # {'name': 'honey', 'age': 18}

这有一个缺陷,修改了字典d1原始内容。那该如何解决呢?我们可以使用动态解包表达式

d1 = {"name": "honey"}
d2 = {"age": 18}
​
print({**d1, **d2}) # {'name': 'honey', 'age': 18}
print(d1) # {'name': 'honey'}

解包过程会进行浅拷贝操作

通过有序字典去重

给定一个列表,我们去重,会想到使用集合

nums = [10, 2, 3, 3, 51, 5, 10, 7, 8, 5]
print(set(nums)) # {2, 3, 5, 7, 8, 10, 51}

很容易就去重了,但是如果我们要求,去重并且要保留成员原有的顺序呢?此时我们可以使用有序字典来实现

from collections import OrderedDict
​
nums = [10, 2, 3, 3, 51, 5, 10, 7, 8, 5]
print(list(OrderedDict.fromkeys(nums).keys())) # [10, 2, 3, 51, 5, 7, 8]

OrderedDict可以保证键是有序的且不会重复

最后

这些技巧还是很实用的,看似是技巧,实则需要了解容器的底层,才能理解使用这些技巧。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值