Python内置数据类型list各方法的性能测试过程解析


Posted in Python onJanuary 07, 2020

这篇文章主要介绍了Python内置数据类型list各方法的性能测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

测试环境

本文所涉及的代码均在MacOS系统与CentOS7下测试,使用的Python版本为3.6.8。

测试模块

测试用的模块是Python内置的timeit模块:

timeit模块可以用来测试一小段Python代码的执行速度。

Timer类

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

Timer是测量小段代码执行速度的类。

stmt参数是要测试的代码语句(statment);

setup参数是运行代码时需要的设置;

timer参数是一个定时器函数,与平台有关。

Timer类的timeit方法

timeit.Timer.timeit(number=1000000)

Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。

列表内置方法的性能测试

我们知道,生成一个列表可以使用列表生成式或者append、insert、extend这些方法,现在我们来看一下这些方法的执行效率:

from timeit import Timer


def test_list():
  lst = list(range(1000))

def test_generation():
  lst = [i for i in range(1000)]


def test_append():
  lst = []
  for i in range(1000):
    lst.append(i)

def test_add():
  lst = []
  for i in range(1000):
    lst += [i]

# 在列表的头部insert
def test_insert_zero():
  lst = []
  for i in range(1000):
    lst.insert(0,i)

# 在列表的尾部insert
def test_insert_end():
  lst = []
  for i in range(1000):
    lst.insert(-1,i)

def test_extend():
  lst = []
  lst.extend(list(range(1000)))


t1 = Timer("test_list()","from __main__ import test_list")
print(f"test_list takes {t1.timeit(number=1000)} seconds")

t2 = Timer("test_generation()","from __main__ import test_generation")
print(f"test_generation takes {t2.timeit(number=1000)} seconds")

t3 = Timer("test_append()","from __main__ import test_append")
print(f"test_append takes {t3.timeit(number=1000)} seconds")

t4 = Timer("test_add()","from __main__ import test_add")
print(f"test_add takes {t4.timeit(number=1000)} seconds")

t5 = Timer("test_insert_zero()","from __main__ import test_insert_zero")
print(f"test_insert_zero takes {t5.timeit(number=1000)} seconds")

t6 = Timer("test_insert_end()","from __main__ import test_insert_end")
print(f"test_insert_end takes {t6.timeit(number=1000)} seconds")

t7 = Timer("test_extend()","from __main__ import test_extend")
print(f"test_extend takes {t7.timeit(number=1000)} seconds")

我们先看看在MacOS系统下,执行上面这段代码的结果:

"""
test_list takes 0.012904746999993222 seconds
test_generation takes 0.03530399600003875 seconds
test_append takes 0.0865129750000051 seconds
test_add takes 0.08066114099983679 seconds
test_insert_zero takes 0.30594958500023495 seconds
test_insert_end takes 0.1522782449992519 seconds
test_extend takes 0.017534753999825625 seconds
"""

我们可以看到:直接使用list方法强转的效率最高,其次是使用列表生成式,而append与直接加的方式紧随其后并且二者的效率相当;insert方法的执行效率最低——并且从头插入的效率要低于从尾部插入的效率!最后我们将强转的列表使用extend方法放入到新的列表中的过程效率并没有减少多少。

然后试试在Linux系统下的执行结果:

Python内置数据类型list各方法的性能测试过程解析

列表pop方法的性能测试

pop可以从第0各位置删除元素,也可以从最后位置删除元素(默认删除最后面的元素),现在我们来测试一下两种从不同位置删除元素的性能对比:

from timeit import Timer

def test_pop_zero():
  lst = list(range(2000))
  for i in range(2000):
    lst.pop(0)


def test_pop_end():
  lst = list(range(2000))
  for i in range(2000):
    lst.pop()
t1 = Timer("test_pop_zero()","from __main__ import test_pop_zero")
print(f"test_pop_zero takes {t1.timeit(number=1000)} seconds")

t2 = Timer("test_pop_end()","from __main__ import test_pop_end")
print(f"test_pop_end takes {t2.timeit(number=1000)} seconds")

在MacOS下程序的执行结果为:

test_pop_zero takes 0.5015365449999081 seconds

test_pop_end takes 0.22170215499954793 seconds

然后我们来试试Linux系统中的执行结果:

Python内置数据类型list各方法的性能测试过程解析

可以看到:从列表的尾部删除元素的效率要比从头部删除的效率高很多!

关于列表insert方法的一个小坑

如果想使用insert方法生成一个列表[0,1,2,3,4,5]的话(当然使用insert方法效率会低很多,建议使用其他的方法)会有一个这样的问题,在此记录一下:

def test_insert():
  lst = []
  for i in range(6):
    lst.insert(-1,i)
    print(lst)

test_insert()

结果竟然是这样的——第一个元素竟然一直在最后!

[0]
[1, 0]
[1, 2, 0]
[1, 2, 3, 0]
[1, 2, 3, 4, 0]
[1, 2, 3, 4, 5, 0]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python logging模块学习笔记
May 24 Python
浅析python 中__name__ = '__main__' 的作用
Jul 05 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
python实现斐波那契数列的方法示例
Jan 12 Python
用pandas按列合并两个文件的实例
Apr 12 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 Python
python模拟实现斗地主发牌
Jan 07 #Python
python全局变量引用与修改过程解析
Jan 07 #Python
python__new__内置静态方法使用解析
Jan 07 #Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 #Python
python单例设计模式实现解析
Jan 07 #Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 #Python
linux环境下安装python虚拟环境及注意事项
Jan 07 #Python
You might like
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
如何设置Java的运行环境
2013/04/05 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
可口可乐广告词
2014/03/20 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
趣味运动会广播稿
2014/09/13 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
小学数学教师研修日志
2015/11/13 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python