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

news2024/11/27 21:04:34

文章目录

      • 前言
      • 列表性能陷阱
        • 陷阱一
        • 陷阱二
      • 快速合并字典
      • 通过有序字典去重
      • 最后
      • 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.coloradmin.cn/o/1342303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

隧道代理HTTP工作原理:一场奇妙的网络魔法表演

嘿,小伙伴们!今天我们要一起探索一个有趣的话题——隧道代理HTTP的工作原理。这不是普通的表演,而是一场奇妙的网络魔法表演! 首先,让我们想象一下,网络世界就像一个大舞台,而我们每个人都是这…

邮政快递查询,邮政快递单号查询,按物流更新量来筛选单号

如何快速、准确地查询多个快递单号的物流信息?如何提高工作效率,减少一个个等待的焦虑?别担心,【快递批量查询高手】为你排忧解难,不仅可以帮你省下大量的时间,还能提高工作效率,让你更好地享受…

喜讯丨智安网络实力上榜《嘶吼2023中国网络安全产业势能榜》

近日,嘶吼安全产业研究院正式发布《嘶吼2023中国网络安全产业势能榜》。智安网络凭借在网络安全行业领先的产品实力、专业的安全服务水平及多年累积的行业经验,从300余家厂商中脱颖而出,成为《中国网络安全产业势能榜》互联网行业势能厂商。 …

计算机网络复习4

网络层——点到点 文章目录 网络层——点到点功能路由算法IPV4NAT 网络地址转换子网划分与子网掩码、CIDR地址解析协议ARP:根据IP地址找到MAC地址动态主机配置协议DHCP网际控制报文协议ICMPIPV6内部网关协议(IGP)外部网关协议(EGP) 功能 异构…

【银行测试】核心系统/信贷系统+各个测试点总结(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、银行核心系统和…

数据结构-八大排序详解(动图+实现详解+总结)

1 前言 本章主要讲解: 八大排序的基本知识及其实现 注:这里的八大排序指直接插入,希尔,选择,堆排,冒泡,快排,归并,基数 八大排序汇总图: 2 排序概念及应用 …

MindOpt 云上建模求解平台:多求解器协同优化

前言 数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。 使用数学规划的方法我们需要确定问题的目标、约束、变量的取值范围,然后进行数学建模,将数学公式转化…

前端使用高德api的AMap.Autocomplete无效,使用AMap.Autocomplete报错

今天需要一个坐标拾取器,需要一个输入框输入模糊地址能筛选的功能 查看官方文档,有一个api可以直接满足我们的需求 AMap.Autocomplete 上代码 AMapLoader.load({"key": "你的key", // 申请好的Web端开发者Key,首次调…

[AI编程]AI辅助编程助手-亚马逊AI 编程助手 Amazon CodeWhisperer

亚马逊AI 编程助手 Amazon CodeWhisperer 是一种基于人工智能技术的编程辅助工具,旨在帮助开发人员更高效地编写代码。它可以提供实时的代码建议、自动补全和错误检查,帮助优化代码质量和提高编程效率。 Amazon CodeWhisperer 使用了自然语言处理和机器…

Lunix的奇妙冒险————权限篇

文章目录 一.什么是权限二.用户权限和类别。1.用户2.角色3.更换文件角色 三.文件的类别和对应权限1.文件的类别。2.文件属性权限1.权限说明。2.默认生成文件权限来源3.更改权限 3.文件的执行与删除 四.不同用户共同在一个目录下的权限。1.普通用户家目录2.在同一目录下文件的权…

述职报告一般怎么写?

在日常生活中,我们经常需要撰写各种报告。对于报告的撰写,我们需要清晰地解释涉及的专业术语。现在,我为大家整理了一些精选的晋升述职报告范文,供大家参考和借鉴。希望这些范文能对大家有所帮助。 晋升述职报告范文精选1 一、个…

力扣题目学习笔记(OC + Swift)19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 此题目为链表题,拿出我们的杀手锏,链表解题经典三把斧: 哑巴节点栈快慢指针 关于内存问题:由于Swift及…

Fiddler 抓包工具的安装与使用

今天分享Fiddler 抓包工具的安装与使用,基于HTTP应用层协议的抓包工具。 一、下载安装 1、下载地址: The Ultimate Web Debugging Tool - Download Fiddler Everywhere | Telerik 选择相应类型: 2、下载完成 3、安装 傻瓜式安装&#xf…

【开源学习】ThingsBoard -- 基本配置与使用

【开源学习】ThingsBoard -- 基本配置与使用 租户及客户管理租户及租户账号管理租户管理租户创建租户修改租户删除 租户账号管理租户账号创建租户账号修改租户账号删除 客户及客户账号管理客户管理客户创建客户修改客户删除 客户用户管理客户用户创建客户用户修改客户用户删除 …

蔓灵花组织wmRAT攻击武器对比分析

概述 蔓灵花,又名"Bitter"、"APT-C-08"、"T-APT-17"以及"苦象",常对南亚周边及孟加拉湾海域的相关国家发起网络攻击,主要针对巴基斯坦和中国两国。其攻击目标主要包括政府部门、核工业、能源、国防…

【数据分享】2023年我国省市县三级的生活服务设施数量(23类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市生活服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、…

Hive05_DML 操作

1 DML 数据操作 1.1 数据导入 1.1.1 向表中装载数据(Load) 1)语法 hive> load data [local] inpath 数据的 path [overwrite] into table student [partition (partcol1val1,…)];(1)load data:表示加载数据 &…

Matplotlib、Pandas可视化工具

一、Matplotlib 1.简介: 数据可视化可以看到变量的分布和变量之间的关系,还可以检查建模过程中的假设。Python 提供了若干种用于绘图的扩展包,包括:Matplotlib、 Pandas、 ggplot 和 Seaborn等。Matplotlib 是最基础的扩展包,它…

CUDA驱动深度学习发展 - 技术全解与实战

全面介绍CUDA与pytorch cuda实战 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士&…

利用全面预算管理,构建企业数智化管理体系

财务团队对于一个企业的发展来说一直承担着巨大的压力,特别是当今的经济世态,财务管理被赋予比以往任何时候更高的期望。为了提高运营效率,降低管理成本,企业朝着数智化的方向逐渐靠拢。其中,全面预算管理的潜在价值是…