Python封装了很好用的结构和方法,为啥还要学数据结构?

2023-11-04

前言

大家前面学过Python基础知识的都知道,Python为我们封装了列表、字典等高级数据类型,并且他们都带有一系列增、删、改、除的方法,让我们能够很方便的处理一些问题。以目前我们这些人的技术水平可能觉得这些东西就够了,照样能够快速的解决很多的问题。可是随着知识的深入,随着问题不断地变难,很多时候我们去用列表、字典这些高级数据类型来解决问题得话可能显得有点力不从心。世界上没有无用的知识,也没有无用的的人!其实你通过深入的学习之后会发现,数据结构这门课程是独立于语言之外的,管他是用什么语言实现,里面的道道都是一样的,至于用Python这门语言来实现的话,他是否会简单一些,这还有待我们深入的去学习和了解。

Python内置数据类型性能分析

下面我们将结合Python中的timeit模块来深入的分析一下,Python中内置的列表、字典等数据类型的性能,对此你可能会对数据结构的深入学习有更强的期待。

timeit模块

timeit模块可以用来测试一小段Python代码的执行速度。
Python中timeit模块定义了接受两个参数的Timer类。两个参数都是字符串,第一个参数是你要计时的语句或者函数,第二个参数是为第一个参数构建环境的导入语句,也就是第一个参数所在的地方,一般是import语句“from __ main __ inport …”。

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)

总结来说:
Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为100万次。方法返回执行代码的平均耗时,一个浮点类型的秒数。

列表内置方法性能分析

下面使用timeit模块中的Timer类来试验一下列表中的各种方法类型的运行时间,找出时间复杂度最低的方法:

from timeit import Timer
def t1():
    li = []
    for i in range(10000):
        li.append(i)

def t2():
    li = []
    for i in range(10000):
        li = li + [i]
        # li += [i]

def t3():
    li = [i for i in range(10000)]

def t4():
    li = list(range(10000))

def t5():
    li = []
    for i in range(10000):
        li.extend([i])

def t7():
    li = []
    for i in range(10000):
        li.insert(0, i)


timer1 = Timer("t1()", "from __main__ import t1")
print("append:", timer1.timeit(1000))

timer2 = Timer("t2()", "from __main__ import t2")
print("+:", timer2.timeit(1000))

timer3 = Timer("t3()", "from __main__ import t3")
print("[i for i in range]:", timer3.timeit(1000))

timer4 = Timer("t4()", "from __main__ import t4")
print("list(range()):", timer4.timeit(1000))

timer5 = Timer("t5()", "from __main__ import t5")
print("extend:", timer5.timeit(1000))

timer6 = Timer("t6()", "from __main__ import t6")
print("append", timer6.timeit(1000))

timer7 = Timer("t7()", "from __main__ import t7")
print("insert(0)", timer7.timeit(1000))

在这里插入图片描述
通过以上试验可以发现使用列表生成器的代码的时间复杂度是比较低的,其中+这个操作的时间复杂度较高,原因在于在做+操作时,每两个列表元素相加都会生成第三个列表来储存相加好了的列表元素,加一次就在内存中生成一个列表,如此下来会造成大量的内存得不到释放,严重占用内存空间,且每一步的操作都很费时。

列表内置操作的时间复杂度

列表内置操作的时间复杂度如下图所示:
在这里插入图片描述

字典内置操作时间复杂度

列表内置操作的时间复杂度如下图所示:
在这里插入图片描述

最后

某些代码和图片来源于我学习的资料。讲到这里或许大家还是不明白我们为什么要学数据结构,更高级的数据结构有什么好处等一系列问题。

我们为了解决问题,需要将数据保存下来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理。我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构。

其实看到这里,列表字典本身就是一种数据结构,只不过是Python封装好了的,其他的高级数据结构类型则需要我们自己去实现,实现的过程就是我们对计算机知识更深入的了解!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python封装了很好用的结构和方法,为啥还要学数据结构? 的相关文章

随机推荐

  • 组件间通信方式

    方式一 props 适用于 父子组件间通信 1 父给子 父组件给子组件传递数据 非函数 本质其实是父组件 gt 子组件传递数据 父组件App vue
  • open/read/write和fopen/fread/fwrite的区别

    open read write和fopen fread fwrite的区别 open 系统调用 返回的是文件描述符 即文件句柄 是文件在文件描述副表里的索引 fopen C语言库函数 返回的是一个指向文件结构的指针 fopen是ANSI C
  • 进程之间为什么需要通信?

    进程是一个独立的资源分配单元 不同进程 这里所说的进程通常指的是用户进程 之间的资源是独立的 没有关联 不能在一个进程中直接访问另一个进程的资源 例如打开的文件描述符 但是 进程不是孤立的 不同的进程需要进行信息的交互和状态的传递等 因此需
  • 已解决io = ExcelFile(io,storage_options=storage.options, engine=engine)

    已解决 Python pandas read excel读取Excel文件报错 io ExcelFile io storage options storage options engine engine 文章目录 报错代码 报错原因 解决方
  • 渗透测试流程&信息收集

    渗透测试是一种评估方法 一种通过模拟黑客的攻击方式 来评估网站安全的方法 渗透测试流程分为7个阶段 信息收集 漏洞扫描 漏洞利用 内网转发 内网渗透 痕迹清除 编写报告 但在这7个阶段之前还有一个前提 就是授权 这个授权包括渗透测试的目标
  • Hbase Compaction 队列数量较大分析(压缩队列、刷新队列)

    前几天朋友公司Hbase集群出现Compaction队列持续处于比较大的情况 并且mem flush队列也比较大 一起看了下问题 大概情况如下图 从图中可以看出来压缩队列总和持续在1000 2000 平对压缩队列在200左右 刷新队列也比较
  • 三菱触摸屏怎么改时间_三菱plc的触摸屏程序,三菱触摸屏如何更改时间

    三菱plc的触摸屏程序 D8013D8014D8015D8016D8017D8018D8019秒 分钟 小时 日 月 年和周 假定上述时间需要改变 屏幕D10D11D12D13D14D15D16秒 分钟 天 月 年和周按钮M0程序LDM0设
  • Hive 用户自定义函数UDF详解

    本例自定义一个Hive UDF函数 功能是将从Hive数据仓库查询出来的字符串进行大小写转换 第一步 创建java工程 添加jar包 导入Hive的lib目录下的jar包以及hadoop安装目录下的hadoop core jar 第二步 新
  • RuoYi实现数据分页

    目录 一 实例简介 登录日志查询 数据分页作用 二 前端代码 1 打开操作日志页面源码文件 2 函数调用链 3 开发者工具查看前端访问后端信息 编辑 三 后端代码 函数startPage 和getDataTable 输出结果 一 实例简介
  • 栈 - 关于出栈序列,判断合法的出栈序列

    文章目录 1 引例 2 做题方法 3 原因 3 1 选项D 4 3 1 2 的模拟 1 引例 例 设栈的入栈序列是 1 2 3 4 则下列不可能是其出栈序列的是 A 1 2 4 3 B 2 1 3 4 C 1 4 3 2 D 4 3 1 2
  • MySQL数据库总体知识架构

    一 关系型数据库设计理论 一些重要术语 属性 attribute 列的名字 我们在开发中一般称为字段 依赖 relation 字段之间存在的关系 元祖 tuple 每一个行 如第二行 1301 小明 13班 篮球 英语 赵英 70 就是一个
  • Murmurhash 哈希算法 介绍与实现

    最近在项目代码中看到了一种hash算法 以前没有遇见过 在此记录下来 一 介绍 MurmurHash 是一种非加密型哈希函数 适用于一般的哈希检索操作 由Austin Appleby在2008年发明 并出现了多个变种 都已经发布到了公有领域
  • 基于单向链表实现LRU缓存淘汰算法

    准备工作 思考 链表是由一个一个结点单向连接而成 因此我们需要创建一个结点类 该类包含结点数据 以及下一个结点的位置信息 一 结点类 package com linkTest public class Node
  • golang反编译_【Golang】脱胎换骨的defer(一)

    Go语言的defer是一个很方便的机制 能够把某些函数调用推迟到当前函数返回前才实际执行 我们可以很方便的用defer关闭一个打开的文件 释放一个Redis连接 或者解锁一个Mutex 而且Go语言在设计上保证 即使发生panic 所有的d
  • Maximum String Length

    The latest version of this topic can be found at Maximum String Length Microsoft Specific ANSI compatibility requires a
  • Flutter的TextButton的最小高度受限的问题

    用ConstrainedBox或SizedBox作TextButton的父级来控制TextButton的Size时 可以加大TextButton 但是用上面的方式设TextButton的高度小于44时 就会失效 可以用下面的方式来解决最小高
  • 判断鼠标是否点击在UI上

    EventSystem current IsPointerOverGameObject 方法 作用 判断鼠标是否点击在UI上 在窗口端进行判断时使用 如果按下了鼠标左键并且 鼠标点击的不是UI if Input GetMouseButton
  • 常见排序算法(c++)

    插入排序 直接插入排序 直接插入排序 Straight Insertion Sort 是一种最简单的排序方法 其基本操作是将一条记录插入到已排好序的有序表中 从而得到一个新的 记录数量增1的有序表 include
  • k-means聚类算法及matlab实现(简单实现)

    k means简介 k means算法也称k均值算法 是一种常用的聚类算法 聚类算法是研究最多 应用最广的一种无监督学习算法 聚类试图将数据集中的样本划分为若干个通常是不相交的子集 每个子集称为一个 簇 通过这样的划分 每个簇里的样本可能具
  • Python封装了很好用的结构和方法,为啥还要学数据结构?

    文章目录 前言 Python内置数据类型性能分析 timeit模块 列表内置方法性能分析 列表内置操作的时间复杂度 字典内置操作时间复杂度 最后 前言 大家前面学过Python基础知识的都知道 Python为我们封装了列表 字典等高级数据类