测开之数据类型・第一篇《Python数据类型元祖和列表的性能分析》

Posted 七月的小尾巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测开之数据类型・第一篇《Python数据类型元祖和列表的性能分析》相关的知识,希望对你有一定的参考价值。

前言

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

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数据类型元祖和列表的性能分析》的主要内容,如果未能解决你的问题,请参考以下文章

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

测开之HTML・第一篇《HTML语法基础》

测开之数据类型进阶篇・第三篇《推导式》

测开之CSS・第一篇《CSS语法基础》

测开之Javascript・《Javascript基础》

测开之内存管理篇・《内存管理机制》