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

这篇文章主要介绍了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]

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

(0)

相关推荐

  • python创建与遍历List二维列表的方法

    python 创建List二维列表 lists = [[] for i in range(3)] # 创建的是多行三列的二维列表 for i in range(3): lists[0].append(i) for i in range(5): lists[1].append(i) for i in range(7): lists[2].append(i) print("lists is:", lists) # lists is: [[0, 1, 2], [0, 1, 2, 3, 4],

  • 详解Python list和numpy array的存储和读取方法

    numpy array存储为.npy 存储: import numpy as np numpy_array = np.array([1,2,3]) np.save('log.npy',numpy_array ) 读取: import numpy as np numpy_array = np.load('log.npy') 运行结果: list存储为.txt 存储: list_log = [] list_log.append([1,2,3]) list_log.append([4,5,6,7])

  • Python List列表对象内置方法实例详解

    本文实例讲述了Python List列表对象内置方法.分享给大家供大家参考,具体如下: 前言 在上一篇中介绍了Python的序列和String类型的内置方法,本篇继续学习作为序列类型成员之一的List类型的内置方法. 软件环境 系统 UbuntuKylin 14.04 软件 Python 2.7.3 IPython 4.0.0 列表List 列表是一种容器,存放内存对象的引用.即是任意内存对象的有序集合,不同的类型对象可以存放在同一个列表中.通过索引来访问其中的元素.可以任意的嵌套.伸长.异构.

  • python list数据等间隔抽取并新建list存储的例子

    原始数据如下: ['e3cd', 'e547', 'e63d', '0ffd', 'e39b', 'e539', 'e5be', '0dd2', 'e3d6', 'e52e', 'e5f8', '0000', 'e404', 'e52b', 'e63d', '0312', 'e38b'] 将其分割为4路数据,分别存储在fetal1.fetal2.mother1.ECG的列表中,各列表对齐,不能整除于4的数据舍去,操作如下: da = ['e3cd', 'e547', 'e63d', '0ffd'

  • 详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法

    前提: list以及array是python中经常会用到的数据类型,当需要对list以及array进行文件的读写操作的时候,由于write函数参数需要的是一个str,所以这时就需要对list或者array进行str的转换了. list和array的不同: 在进行转换之间先研究下python中list和array(np.array)的不同: 1.list是python中内置的数据类型,其中的数据的类型可以不相同,如java中List也可以不用相同的数据,但是为了格式的统一,就要用到泛型或者Arra

  • python实现两个字典合并,两个list合并

    1.两个字典:a={'a':1,'b':2,'c':3} b= {'aa':11,'bb':22,'cc':33} 合并1:dict(a,**b) 操作如下: >>> a={'a':1,'b':2,'c':3} >>> b= {'aa':11,'bb':22,'cc':33} >>> dict(a,**b) {'a': 1, 'aa': 11, 'c': 3, 'b': 2, 'bb': 22, 'cc': 33} >>> 合并2:d

  • python list多级排序知识点总结

    在python3的sorted中去掉了cmp参数,转而推荐"key+lambda"的方式来排序. 如果需要对python的list进行多级排序.有如下的数据: list_num = [[12,3],[18,34],[18,10],[12,45],[18,10],[8,34]] 需要从小到大的排序.先比较第一个数,如果第一个数相等的话比较第二个数.代码如下: #默认的sort函数会先对第一个比较,如果第一个相等再比较第二个 print(sorted(list_num)) //OUTPUT

  • Python 中list ,set,dict的大规模查找效率对比详解

    很多时候我们可能要频繁的进行元素的find 或in操作,本人一直天真的以为python的list做了hash,通过红黑树来高效查找···直到今天我真正来测试它和set,dict的查找效率时,才发现自已想太多了!!!! 先看代码: __author__ = 'jmh081701' import numpy import time l=[] sl=set() dl=dict() r=numpy.random.randint(0,10000000,100000) for i in range(0,10

  • python list转置和前后反转的例子

    list/tuple转置: 以二维grid[][]为例: grid = [[row[i] for row in grid] for i in range(len(grid[0]))] 效果如图: list/tuple反转: for i in range(10): # fanzhuan grid[i].reverse() 效果如图: 以上这篇python list转置和前后反转的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python中list循环遍历删除数据的正确方法

    前言 初学Python,遇到过这样的问题,在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_list)): if num_list[i] == 2: num_list.pop(i) else: print(num_list[i]) print(num_list) 会报异常:IndexError: list index out of range 原

  • Python中的list与tuple集合区别解析

    Python中内置了list集合与tuple集合,在list集合中可以实现元素的添加.修改.插入.以及删除.tuple集合看似与list类似,但两者还是有很大的区别. 在tuple集合中,一旦元素被存储,以后就不能修改,删除了,这比list集合安全许多,所以能用tuple就用tuple.以下是list集合代码实现. L=['Java','Python','C++'] #注意,这里用的是中括号来表示list集合 L.append('PhP')#元素的添加 print(L[-1])#查找最后一个元素

随机推荐