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

文章目录

      • 前言
      • 列表性能陷阱
        • 陷阱一
        • 陷阱二
      • 快速合并字典
      • 通过有序字典去重
      • 最后
      • Python技术资源分享
        • 1、Python所有方向的学习路线
        • 2、学习软件
        • 3、入门学习视频
        • 4、实战案例
        • 5、清华编程大佬出品《漫画看学Python》
        • 6、Python副业兼职与全职路线


在这里插入图片描述

前言

今天看到一些关于容器的使用技巧,这里分享给大家,一起提高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系统学习教程】,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。

保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

如果你是准备学习Python或者正在学习,下面这些你应该能用得上:

1、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

2、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

在这里插入图片描述

3、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

4、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

5、清华编程大佬出品《漫画看学Python》

用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。

在这里插入图片描述

6、Python副业兼职与全职路线

在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

👉CSDN大礼包:《Python入门资料&实战源码&安装工具】免费领取安全链接,放心点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307208.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer各模块结构详解(附图)

前言:基于TRANSFORMER的结构在视觉领域是承上启下的作用。刚接触会比较难,上的话需要对RNN,LSTM,ATTENTION先有初步的了解。下的话需要学习VIT,GPT,DETR等结构先了解TRANSFORMER都是必要的。 参考&#xff…

阿里云2核2G3M轻量应用服务器又降了1块钱?

阿里云和腾讯云怎么了?之前轻量应用服务器2核2G3M配置阿里云降价到63元一年,同款配置的腾讯云轻量应用服务器2核2G3M配置降价为62元一年,现在阿里云这台云服务器又降价了,现在是61元一年,真无语,阿腾云aten…

IP地址SSL证书

IP地址SSL证书是一种专门针对公网IP地址颁发的数字证书。与常规的域名SSL证书类似,其主要目标是提供数据加密和身份验证。以下几点概述了IP地址SSL证书的重要特性及其申请过程: 1. 保护直接IP访问: 当用户直接通过IP地址访问服务时&#xff…

mysql中按字段1去重,按字段2降序排序

数据举例 sql语句 按字段field4降序排序,按字段field1去重 SELECT tt1.name2,tt1.field1,tt1.field2,tt1.field4 from ( select tt2.name2,tt2.field1,tt2.field2,tt2.field4 from t2 tt2 ORDER BY tt2.field4 DESC ) tt1 GROUP BY tt1.field1执行结果

低代码平台搭建ERP系统 低代码快速开发灵活的ERP

随着数字化时代的到来,企业迫切需要高效、灵活的ERP系统来提高运营效率。在这一背景下,白码低代码平台成为了企业实现数字化转型的首选工具。本文将介绍低代码开发ERP的概念,并以白码低代码平台为例,探讨其在企业数字化转型中的重…

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了,谈到儿童教育,各位有什么新奇的想法嘛 我觉得第一要务,要注重习惯养成,我觉得聊习惯养成这件事情范围有点太大了,我想把习惯归纳于底层逻辑,我们大家都知道,在中国式教育下&a…

OpenHarmony之系统调用

背景 对于运行L0系统的硬件一般是mcu,资源有限,L0系统没有区分内核态和用户态,所有的代码都在内核态运行,所以不需要系统调用 L2系统用的是Linux内核,所以系统调用跟Linux Kernel的是一样的。 所以我们主要来看看L1系…

MFT端口报错处理手册

MFT端口主要包括:AS2,OFTP,SFTP,FTP等,覆盖当前EDI传输过程中可能会使用到的几乎所有传输协议。 知行之桥的MFT端口通过提供以下功能扩展了核心端口的文件传输功能: 安全的点对点文件传输协议,如AS2、AS4等服务器端支持FTP和SFT…

父子组件通信 - 子组件内同步更新父组件内数据,实现父组件与子组件数据双向绑定 $emit(‘update:active-type‘, ‘card‘)

1. 概述 - 父子组件通信 父组件传给子组件数据,子组件props接收,当子组件内需要修改props接受的数据时,通常我们会给父组件中子组件写一个 自定义事件,然后调用自定义事件,并将需要修改的数据值传给自定义事件&#xf…

Jmeter吞吐量控制器总结

吞吐量控制器(Throughput Controller) 场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现。 添加吞吐量控制器 用法1: Percent Executions 在一个线程组内分别建立两个吞吐量控制器, 分别放业务A和业务B …

利用Jmeter做接口测试(功能测试)全流程分析

利用Jmeter做接口测试怎么做呢?过程真的是超级简单。 明白了原理以后,把零碎的知识点填充进去就可以了。所以在学习的过程中,不管学什么,我一直都强调的是要循序渐进,和明白原理和逻辑。这篇文章就来介绍一下如何利用…

传感器原理与应用复习--磁电式与霍尔传感器

文章目录 上一篇磁电感应传感器工作原理应用 霍尔传感器工作原理基本特性应用 下一篇 上一篇 传感器原理与应用复习–电容式与压电式传感器 磁电感应传感器 工作原理 导体在稳恒均匀磁场中,沿垂直磁场方向运动时,产生的感应电势为 e B l v e Blv …