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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
Python创建系统目录的方法
Mar 11 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
通过python实现随机交换礼物程序详解
Jul 10 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
python读取pdf格式文档的实现代码
Apr 01 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
PHP整合PayPal支付
2015/06/11 PHP
laravel学习教程之关联模型
2016/07/30 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
Django中多种重定向方法使用详解
2019/07/17 Python
Python如何安装第三方模块
2020/05/28 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
介绍Java的内部类
2012/10/27 面试题
高中三年学习生活的自我评价
2013/10/10 职场文书
电钳专业个人求职信
2014/01/04 职场文书
天地会口号
2014/06/17 职场文书
歌剧魅影观后感
2015/06/05 职场文书
初三毕业感言
2015/07/31 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis