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系统下的执行结果:

列表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系统中的执行结果:

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

关于列表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]

~~~

原文地址:https://www.cnblogs.com/paulwhw/p/12150685.html

时间: 2024-11-09 04:41:27

Python内置数据类型list各方法的性能测试的相关文章

python 内置数据类型

一.Dictionary 的介绍 dictionary 是python 的内置类型之一,它定义键和值之间一对一的关系 1.定义dictionary 2.修改dictionary NOTE: Dictionary 是无序的.当使用 dictionary 时,您需要知道:dictionary 的 key 是大小写敏感的. 3.dictionary 中混用数据类型 4.dictionary 删除元素 二.List 介绍 List 是 Python 中使用最频繁的数据类型.它很像java中的ArrayL

python基础-内置数据类型

一.简介 如果你用过C或者C++,你该知道你的许多工作集中在实现数据结构上面.你需要管理内存分配,部署内存结构等等.这些东西比较乏味,通常会让你无法集中在真正想实现的目标上面. 而在Python中,许多这种乏味的工作都去去除了.Python提供了强大的对象类型作为Python语言的一部分,解决问题时,你不需要手工写代码来实现这些结构了.而且你也不需要亲自实现自己的数据类型.因为内置对象类型有很多好处.如果你是一个编程大牛,哪另当别论,对于初学者,我们首先需要知道如何使用. Python内置数据类

(一)Python入门-2编程基本概念:07内置数据类型-基本算数运算符

一:Python内置数据类型 每个对象都有类型,python中最基本的内置数据类型: 1. 整型:整数,2345,10,50 2. 浮点型:小数,3.14 或者科学计数法 314e-2 3. 布尔型:表示真假,仅包含:True.False 4. 字符串型:由字符组成的序列. “abc”,”speed”,“我爱你” 二:数字和基本运算符 Python 支持整数(如:50,520)和浮点数(如:3.14,10.0, 1.23e2),我们可以对数字做如下 运算. 运算符 说明 示例 结果 + 加法 3

Python的内置数据类型

Python在编程语言中的定位: 脚本语言--scriptinglanguage 高阶动态编程语言. Python是以数据为主,变量的值改变是指变量去指到一个地址. Id(变量)-->>展示变量的地址. 一个具体的值,会有不同的变量名.. Python的数据类型: 数字.字符串.列表.元组.字典 数字和字符串其实是很基本的数据类型,在Python中和其他语言相差不是很大的,在这里就不细讲了. Dictionary介绍 Dictionary是Python的内置数据类型之一,它定义了键和值之间的一

【Python】内置数据类型

参考资料: http://sebug.net/paper/books/dive-into-python3/native-datatypes.html http://blog.csdn.net/hazir/article/details/10159709 1.Boolean[布尔型] # coding:utf-8 ''' Created on 2014-4-29 @author: Administrator ''' # Python中的布尔值为True.False,首字母大写 def test_b

Python中内置数据类型list,tuple,dict,set的区别和用法

Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. (原链接:http://www.jb51.net/article/76339.htm) List 字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List: ? 1 L = [12, 'China', 19.998] 可以看到并不要求元素的类型都是一样的.当然也可以定

python计算非内置数据类型占用内存

getsizeof的局限 python非内置数据类型的对象无法用sys.getsizeof()获得真实的大小,例: import networkx as nx import sys G = nx.Graph() l = [i for i in xrange(10000)] print "size of l:", sys.getsizeof(l) G.add_nodes_from(l) print "size of graph:", sys.getsizeof(G)

扩展内置数据类型要注意先检测

1 /* 2 * 扩展内置数据类型 3 * 要注意, javascript的内置数据类型可能已经定义了这个方法 4 * 所以, 在自己定义方法之前, 要检测这个方法是否存在. 5 * 方式如下: 6 */ 7 String.prototype.repeatify = String.prototype.repeatify || function(times) { 8 var str = ''; 9 for(var n=0; n<times; n++) { 10 str += this; 11 }

C++内置数据类型和变量

一.数据类型 1.什么是数据类型? 数据类型是为了固定内存空间的别名. 2.数据类型解决什么问题? 解决编程中出现的各种各样的数据. 3.数据类型分类? C++内置数据类型可分为两组:第一组为基本类型,包括整数和浮点数:第二组为复合类型,包括数组.字符串.结构.类和指针. 二.变量 1.什么是变量? 变量就是一段连续内存空间的别名,程序通过变量来申请.命名.访问内存空间. 2.变量解决C++当中什么问题? 信息将存储在哪里 要存储什么值 存储何种类型的信息