[Python3]为什么map比for循环快
实验结论
- 如果需要在循环结束后获得结果,推荐列表解析;
- 如果不需要结果,直接使用for循环, 列表解析可以备选;
- 除了追求代码优雅和特定规定情境,不建议使用map
如果不需要返回结果
这里有三个process, 每个任务将通过增加循环提高时间复杂度
	def process1(val, type=None):
	    chr(val % 123)
	def process2(val, type):
	    if type == "list":
	        [process1(_) for _ in range(val)]
	    elif type == "for":
	        for _ in range(val):
	            process1(_)
	    elif type == "map":
	        list(map(lambda _: process1(_), range(val)))
	def process3(val, type):
	    if type == "list":
	        [process2(_, type) for _ in range(val)]
	    elif type == "for":
	        for _ in range(val):
	            process2(_, type)
	    elif type == "map":
	        list(map(lambda _: process2(_, type), range(val)))
然后通过三种循环方式,去依次执行三种任务
	def list_comp():
	    [process1(i, "list") for i in range(length)]
	    # [process2(i, "list") for i in range(length)]
	    # [process3(i, "list") for i in range(length)]
	def for_loop():
	    for i in range(length):
	        process1(i, "for")
	        # process2(i, "for")
	        # process3(i, "for")
	def map_exp():
	    list(map(lambda v: process1(v, "map"), range(length)))
	    # list(map(lambda v: process2(v, "map"), range(length)))
	    # list(map(lambda v: process3(v, "map"), range(length)))



从上述的图像中,可以直观的看到, 随着任务复杂度的提高以及数据量的增大,每个循环完成需要的时间也在增加,
但是map方式花费的时间明显比其他两种要更多。 所以在不需要返回处理结果时,选择标准for或者列表解析都可以。
因为标准for循环和列表解析方式在循环任务复杂度逐渐提高的情况下,处理时间基本没有差异。
需要返回结果
这里有三个task, 每个任务将通过增加循环提高时间复杂度
	def task1(val, type=None):
	    return chr(val % 123)
	def task2(val, type):
	    if type == "list":
	        return [task1(_) for _ in range(val)]
	    elif type == "for":
	        res = list()
	        for _ in range(val):
	            res.append(task1(_))
	        return res
	    elif type == "map":
	        return list(map(lambda _: task1(_), range(val)))
	def task3(val, type):
	    if type == "list":
	        return [task2(_, type) for _ in range(val)]
	    elif type == "for":
	        res = list()
	        for _ in range(val):
	            res.append(task2(_, type))
	        return res
	    elif type == "map":
	        return list(map(lambda _: task2(_, type), range(val)))
然后通过三种循环方式,去依次执行三种任务
	def list_comp():
	    # return [task1(i, "list") for i in range(length)]
	    return [task2(i, "list") for i in range(length)]
	    # return [task3(i, "list") for i in range(length)]
	def for_loop():
	    res = list()
	    for i in range(length):
	        # res.append(task1(i, "for"))
	        res.append(task2(i, "for"))
	        # res.append(task3(i, "for"))
	    return res
	def map_exp():
	    # return list(map(lambda v: task1(v, "map"), range(length)))
	    return list(map(lambda v: task2(v, "map"), range(length)))
	    # return list(map(lambda v: task3(v, "map"), range(length)))



从上述的图像中,可以直观的看到, 随着任务复杂度的提高以及数据量的增大,每个循环完成需要的时间也在增加,
但是明显看出, 使用list_comp列表解析在, 循环需要返回处理结果的每次任务中都表现的很好,基本快于其他两种迭代方式。
而标准for循环和map方式在循环任务复杂度逐渐提高的情况下,处理时间基本没有差异。
为什么普遍认为map比for快?
我认为可能跟处理的数据量有关系,大部分场景下,使用者只测试了少量的数据(100W以下,比如这篇文章,就是数据量比较少,导致速度的区别不明显),在少量的数据集下,我们确实看到了map方式比for循环快,甚至有时候比列表解析还稍微快一点,但是当我们逐渐把数据量增加原来的100倍,这时候差距的凸现出来了。

如上图,在小数据集上(100W-1KW之间), 三者消耗的时间差不多相等,但是用map方式遍历和处理,还是有一定的加速优势。
具体实验代码可以通过Github获得
[Python3]为什么map比for循环快的更多相关文章
- Map<String, String>循环遍历的方法
		Map<String, String>循环遍历的方法 Map<String, String>循环遍历的方法 Map<String, String>循环遍历的方法 下 ... 
- Python3 字典(map)
		ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ... 
- Python2与Python3的map()
		1. map()函数 Python2中,map(func, seq1[,seq2[...[,seqn)将func作用于seq*的每个序列的索引相同的元素,并最终生成一个[func(seq1[0], s ... 
- forkjoin及其性能分析,是否比for循环快?
		最近看了网上的某公开课,其中有讲到forkjoin框架.在这之前,我丝毫没听说过这个东西,很好奇是什么东东.于是,就顺道研究了一番. 总感觉这个东西,用的地方很少,也有可能是我才疏学浅.好吧,反正问了 ... 
- 解决Python3下map函数的显示问题
		今天小编就为大家分享一篇解决Python3下map函数的显示问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.P ... 
- Python3下map函数的显示问题
		map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.Python官方文档中是这样解释map函数的: map(function, iterable, ...) Return an it ... 
- java中对map使用entrySet循环
		根据JDK5的新特性,用For循环Map,例如循环Map的Key 1 2 3 for(String dataKey : paraMap.keySet()) { System.out.p ... 
- python3学习笔记十(循环语句)
		参考http://www.runoob.com/python3/python3-loop.html 循环语句 while循环 # !/usr/bin/env python3 n = 100 sum = ... 
- map和list循环遍历
		//map遍历(zmm是实体类) Map<String, zmm> maps = new HashMap<String, zmm>(); //给map存值: maps.put( ... 
随机推荐
- DataHub——实时数据治理平台
			DataHub 首先,阿里云也有一款名为DataHub的产品,是一个流式处理平台,本文所述DataHub与其无关. 数据治理是大佬们最近谈的一个火热的话题.不管国家层面,还是企业层面现在对这个问题是越 ... 
- P1353   Running S
			题意:https://www.luogu.com.cn/problem/P1353 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行 n 分钟的晨跑.在每分钟的开始 ... 
- centos系统克隆
			首先保证虚拟机处于关机状态. 1.修改网卡信息 vi /etc/sysconfig/network-scripts/ifcfg-eth0 删除网卡信息HWADDR与UUID信息 修改IPADDR信息为 ... 
- Spring官网阅读(八)容器的扩展点(三)(BeanPostProcessor)
			在前面两篇关于容器扩展点的文章中,我们已经完成了对BeanFactoryPostProcessor很FactoryBean的学习,对于BeanFactoryPostProcessor而言,它能让我们对 ... 
- 真香!PySpark整合Apache Hudi实战
			1. 准备 Hudi支持Spark-2.x版本,你可以点击如下链接安装Spark,并使用pyspark启动 # pyspark export PYSPARK_PYTHON=$(which python ... 
- iOS开发--性能调优记录
			CPU VS GPU 关于绘图和动画有两种处理的方式:CPU(中央处理器)和GPU(图形处理器).但是由于历史原因,我们可以说CPU所做的工作都在软件层面,而GPU在硬件层面 对于图像处理,通常用硬件 ... 
- 第一行Kotlin系列(二)Intent隐式显式跳转及向下传值
			1.Intent显式跳转页面 val button5 = findViewById<Button>(R.id.mButton5) button5.setOnClickListener { ... 
- 使用Optional,不再头疼NPE
			前言 在 Java 语言开发中,可能大多数程序员遇到最多的异常就是 NullPointException 空指针异常了.这个当初语言的开发者"仅仅因为这样实现起来更容易"而允许空引 ... 
- 手把手教你用Python网络爬虫获取网易云音乐歌曲
			前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ... 
- P3254 圆桌问题 网络流
			P3254 圆桌问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f; struct Edge { int f ... 
