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之玩转字符串(2)更新篇
Sep 28 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
django 创建过滤器的实例详解
Aug 14 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
python对html过滤处理的方法
Oct 21 Python
在Python中定义一个常量的方法
Nov 10 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
用python实现学生管理系统
Jul 24 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
Python实战之实现康威生命游戏
Apr 26 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
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
教师工作表现自我评价
2015/03/05 职场文书
污水处理保证书
2015/05/09 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书