Python循环、列表生成器、filter效率对比试验

本文通过实验对比了Python中处理列表过滤的三种方法:for循环、列表生成器和filter函数的效率。在不同CPU环境下,对包含1000个随机数字的列表进行正数筛选,发现列表生成器在效率上优于for循环和filter函数。测试在CPython解释器下进行,使用timeit模块进行性能测量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

咪哥杂谈

640?wx_fmt=png

本篇阅读时间约为 5 分钟。


 


1

前言


在编程的过程中,大家肯定会遇到一个场景,就是类似在 list、set、tuple 中根据某些条件进行过滤,筛选过后生成新的元素列表。


对于这个场景而言,在 Python 中有许多中不同的方案可以去解决,那么哪一种才是效率最高的?今天就来小小的做个实验体验下。


2

环境介绍


两台 windows 电脑,Python 版本均为 3.0+ 。代码相同,不同的是 CPU。


笔者 CPU 型号:


640?wx_fmt=png


同学 CPU 型号:


640?wx_fmt=png

3

测试场景代码


假设现在的场景是有一个含有 1000 个数字的列表,其中这个列表中包含正数和负数,如果让你将所有正数挑选出来并且生成新的列表,如何解决?(如果看过笔者之前小课堂的示例,就知道方案都介绍过。)


生成 1000 个 -100 到 100 的随机list:


from timeit import timeit	
import random	
	
random.seed(10)  # 为了让每次随机结果相同,设置随机种子	
x_list = [random.randint(-100, 100) for _ in range(1000)]


思考过后再往下看:


方案一,最常规写法 for 遍历:



 
def for_func():	
    """ for 循环测试 """	
    new_list = []	
    for x in x_list:	
        if x > 0:	
            new_list.append(x)	
    return new_list


方案二,列表生成式:



 
new_list = [x for x in x_list if x > 0]


方案三,filter高级函数:



 
new_list = list(filter(lambda x: x > 0, x_list))

4

测试效率


在 Python 中,有一个模块叫 timeit,此模块可以直接进行效率测速,来简单的看下官方文档如何介绍的:


640?wx_fmt=png

640?wx_fmt=png


如果大家有所了解,Python 解释器是有不同版本的,平时我们用的是 CPython 解释器,上面的方法即 CPython 的用法。若是在 IPython 中,则可以直接用 timeit xxxx 来进行使用。


在 CPython 中,我选择的是图中红框部分的示例代码来做演示:


640?wx_fmt=png


如果 number 参数不写的话,默认是循环 100000 次来执行。在测试用例中,number 默认,可以进源码查看:


640?wx_fmt=png


测试用例元素个数 1000 ,每种写法循环测试 100000 次。


结果,

我的:


640?wx_fmt=png


同学的:


640?wx_fmt=png


测试用例元素个数 100 ,每种写法循环测试 100000 次。


结果,

我的:


640?wx_fmt=png


同学的:


640?wx_fmt=png


5

拓展


关于字典和集合,也是可以使用生成器形式来进行此场景过滤的,回顾:python小课堂34 - 推导式与生成器


6

总结


综上所述,在此场景下,效率最高的列表推导式,若是简单的逻辑,推荐大家使用列表推导式写法,如果推导式满足不了需求,在考虑另外两种。





▼往期精彩回顾▼ Python处理图片九宫格,炫酷朋友圈
人生第一份工作总结(再见,前任)
爬虫的一些主观看法



640?wx_fmt=png

640?wx_fmt=png你点的每个在看,我都认真当成了喜欢


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值