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专用方法与迭代机制实例分析
Sep 15 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python jieba库用法及实例解析
Nov 04 Python
python装饰器原理与用法深入详解
Dec 19 Python
tensorflow 模型权重导出实例
Jan 24 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 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
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
Js callBack 返回前一页的js方法
2008/11/30 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
python对象及面向对象技术详解
2016/07/19 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
基于python中theano库的线性回归
2018/08/31 Python
Python rstrip()方法实例详解
2018/11/11 Python
Python制作动态字符图的实例
2019/01/27 Python
Python FFT合成波形的实例
2019/12/04 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
销售代表求职自荐信
2013/10/01 职场文书
护理不良事件检讨书
2014/02/06 职场文书
公益广告语集锦
2014/03/13 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
董事长开业致辞
2015/07/29 职场文书
Python实现单例模式的5种方法
2021/06/15 Python