测开之数据类型・第一篇《python数据类型元祖和列表的性能分析》(代码片段)

七月的小尾巴 七月的小尾巴     2022-12-26     650

关键词:

前言

通常在入门初期我们的目标主要是实现需求为主,但是随着项目的数据量越来越大,我们就需要考虑到程序的性能问题,那么平时我们常用的数据类型,元祖和列表,哪个性能会更好呢?下面我们来通过实例给大家掩饰一下。

python 官方提供库 – timeit

# 导入库
import timeit

下面我们来看一下 timeit 的底层源码。

timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。

timer=default_timer 指的是默认执行的次数,这里我们可以看到,他默认设置的值是 default_number = 1000000

下面我们在ipython中分别将元祖和列表的数据打印,从下方数据中我们可以看到,同样是执行10000000,可以看到元祖的速度是列表的三倍左右。


元祖和列表的内存空间分配

从下图我们可以看到,使用 __sizeof__()函数查看元祖和列表的内存容量,他们的内存空间分配有所不同。在我们创建列表的时候,程序会在内存中初始化划分一块区域给列表,当程序内部检测到内存不足时,会给列表自动扩容。因此列表的内存大小是可变的。

但是元祖是不可变类型,因此在定义元祖的时候,在分内存的时,内存大小是固定的,因此元祖占用的内存会比列表小。


什么情况下会使用元祖呢?

当希望内容不被轻易改写的时候,需要使用元组。如果数据需要频繁修改,那么需要使用列表。列表提供了比元组更丰富的内置方法,这相当大的提高了编程的灵活性,元组固然安全,但元组一定创建就无法修改。元组只有在特殊的情况才用到,平时还是列表用的多。

命名元祖

我们之前在学习元祖的时候,取元祖内部的元素都是在同下表索引来进行取值的。比如一个元祖中包含了三个元素,我们想要读取元祖中的数据,就需要通过下标获取。

test_tuple = ("tester", 18, "男")
print(test_tuple[0])

结果:
tester

那么有时候我们并不是我们所需要的数据索引值是多少,应该怎么去读取到具体数据呢?python中提供了一个函数 命名元祖

下面我们来看一下命名元祖的实现方式:

from collections import namedtuple

# 创建一个 “info_tuple” 类, 定义 "name", "age", "sex" 三个属性
info_tuple= namedtuple("info_tuple", ["name", "age", "sex"])
test = user_info("小余", 18, "女")
print(test)

返回:
info_tuple(name='小余', age=18, sex='女')

从上方代码中,我们看到使用命名元祖,可以使用 namedtuple 方法给元祖定义属性。定义之后,我们就可以如字典一般取值。假设我们想要获取name的数据,操作如下

from collections import namedtuple

# 创建一个 “info_tuple” 类, 定义 "name", "age", "sex" 三个属性
info_tuple= namedtuple("info_tuple", ["name", "age", "sex"])
test = user_info("小余", 18, "女")
print(test.name)

返回:
小余

测开之数据类型进阶篇・第四篇《生成器和迭代器》(代码片段)

这里写目录标题生成器表达式生成器的定义为什么要有生成器创建生成器生成器的工作原理迭代器可迭代对象迭代器对象工作原理迭代器的优缺点生成器表达式生成器的定义在Python中,一边循环一边计算的机制,称为生... 查看详情

测开之数据类型进阶篇・第三篇《推导式》(代码片段)

目录列表推导式什么是推导式?推导式代码实现推导式的误区在列表推导式中添加if语句列表推导式中实现多个循环字典推导式字典推导式实现列表推导式什么是推导式?列表推导式可以利用range区间、元组、列表、字典... 查看详情

测开之html・第一篇《html语法基础》(代码片段)

目录HTML页面结构文档声明页面头部页面内容常见的HTML标签注释标题标签段落和换行标签块标签含样式和语义的行内标签图像标签和链接标签列表有序列表无序列表表格表单form标签from表单中包含的元素input标签label标签textarea标... 查看详情

测开之css・第一篇《css语法基础》(代码片段)

目录css介绍和引用css概述css的基础语法css引入方法css背景设置背景色设置背景图像背景定位css文本样式css选择器标签选择器id选择器类选择器属性选择器包含选择器(层级选择器)组选择器css介绍和引用css概述CSS指的是层... 查看详情

测开之javascript・《javascript基础》(代码片段)

Javascript介绍和基本使用Javascript概述嵌入页面的方式基本用法注释变量数据类型运算符条件语句函数对象循环扩展介绍和基本使用Javascript概述要了解JavaScript,我们首先要回顾一下JavaScript的诞生。在上个世纪的1995年,当... 查看详情

测开之内存管理篇・《内存管理机制》(代码片段)

内存管理机制内存管理机制引用计数机制数据池和缓存小整数池Intern机制缓存机制垃圾回收机制引用计数标记清除分代回收机制内存管理机制在python中创建对象的时候,首先会去申请内存地址,然后对这个对象进行初始... 查看详情

python的数据类型

一、元祖和列表1.元祖和列表的性能分析元祖的性能要优于列表,元祖是固定长度不可变,列表是可变的,在分配内存的时候列表会占用更多的内存资源,应为列表需要在原有的基础上在继续扩容,而元祖在创建的时候大小就是... 查看详情

基础数据类型(列表,元祖)

列表(list)是Python以及其他语言中最常用到的数据结构之一。Python使用使用中括号[]来解析列表。[1,2,‘c‘,‘dfas‘,True]索引和切片。li=[1,2,3,‘af‘,‘re‘,4,‘45‘]print(li[0])print(li[3])print(li[-1])切片输出的结果也是列表,形成的新... 查看详情

测开之面向对象进阶篇・《多态》(代码片段)

面向对象三大特征面向对象编辑的三大特征:封装、继承、多态。封装:客观的失误封装成类(将数据和方法放在一个类中构成了封装)。继承:python中一个类可以继承于一个类,也可以继承多个类,... 查看详情

测开之vue・《vue高级特性》(代码片段)

Vue基础语法及高级特性Vue基本语法初始Vue安装vueVue的指令和插值属性绑定事件绑定vue的双向数据绑定分支语句遍历语句Vue基本语法初始VueVue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是,Vue被设计为可以... 查看详情

元祖,字典,集合数据类型(代码片段)

1.元组数据类型介绍  与元祖的定义方式与列表类似,列表为[],而元祖的定义则是()元素与元素中间也是以逗号隔开,元祖是不可变类型(它的元素不能被修改,也不能向其中添加和删除元素),  1、按索引取值(正向取+反... 查看详情

javascript学习之第一篇javascript的数据类型(2016/8/29晚23:12)

1.JavaScript的数据类型  JavaScript里面有6中数据类型 BooleanStringNumberUndefinedNull  Object object(对象)类型包含了数组(arrays)函数(functions)以及其他一般对。  数字(Numbers)类型可以是整型(intergers)或者浮点数(floatpoint)类型以及... 查看详情

redis第一篇——几种数据类型

标题上写Redis的几种数据类型,主要是与实现这几种数据类型的底层数据结构进行区分的。Redis支持的每种数据类型由其底层数据结构机型实现。几种数据类型1.stringString类型用于存储整数、字符串等,其底层是通过Redis在... 查看详情

第二篇:流程控制数据类型字符编码文件处理

第二篇:流程控制、数据类型、字符编码、文件处理   PYTHON-流程控制之if/while/forPYTHON-流程控制之if/while/for-练习PYTHON-基本数据类型-数字类型,字符串类型,列表类型PYTHON-基本数据类型-数字类型,字符串类型,列表... 查看详情

高级数据类型---元祖[tuple](代码片段)

...在于元组的元素不能修改,让列表不可以被修改,以保护数据安全元组表示多个元素组成的序列元组在Python开发中,有特定的应用场景用于存储一串信息,数据之间使用,分隔元组用()定义,元组的索引从0开始,索引就是数据在... 查看详情

python开发第一篇:目录

初识Python编程语言介绍条件语句和基本数据类型第二章python基础之函数/递归/内置函数阅读目录  -[数学定义的函数与Python中的函数](https://www.cnblogs.com/hui147258/p/10810797.html)  -为何使用函数  -函数和过程  -函数参数  -... 查看详情

测开之面向对象进阶篇・《属性自省》(代码片段)

私有属性类里面定义的变量叫做属性,那么类属性有两种,分为:公有属性和私有属性。私有属性的定义:单下滑线开头:_attr双下划线开头:__attr其中单下划线开头的在外部可以直接访问,双下滑线&#... 查看详情

测开之面向对象进阶篇・《魔术方法》(代码片段)

魔术方法在类方法中__init__方法有什么作用?创建对象时,自动调用对创建的对象进行初始化设置。什么是魔术方法?在python中,像__init__这类双下滑线开头和结尾的方法,统一称之为魔术方法。注意:在... 查看详情