python并发 map函数的妙用

news2024/11/24 13:36:46
1.map是什么?

map函数是Python中的一个内置函数,用于将一个函数应用到一个或多个可迭代对象的每个元素上,生成一个新的可迭代对象。它的一般形式是:

map(function, iterable1, iterable2, ...)

其中,function是一个函数或其他可调用对象,用于处理输入的元素;iterable1, iterable2, ... 是一个或多个可迭代对象,即待处理的数据。 

2.map函数的工作原理?

map函数的工作原理是,将传入的函数应用到每个可迭代对象对应位置的元素上,然后将结果作为一个新的可迭代对象返回。如果传入的可迭代对象的长度不一致,map函数会以最短的可迭代对象的长度为准,忽略掉多余的部分。

map函数返回的结果是一个迭代器(在Python 3中,map返回的是一个迭代器对象),因此如果需要查看结果,可以使用list()函数将其转换为列表。

下面是一个简单的示例,演示了如何使用map函数将一个列表中的每个元素都加1:

# 定义一个函数,用于将传入的数字加1
def add_one(x):
    return x + 1

# 创建一个列表
numbers = [1, 2, 3, 4, 5]

# 使用map函数将add_one函数应用到numbers列表的每个元素上
result = map(add_one, numbers)

# 将结果转换为列表并打印
print(list(result))  # 输出为 [2, 3, 4, 5, 6]
3.map函数具体是怎么实现的呢?

map函数的实现通常是由Python解释器提供的,而且通常是使用C语言编写的,因此它的具体实现不是由Python代码完成的。

然而,可以简单地描述一下map函数的典型实现方式:

  1. map函数接收一个函数和一个或多个可迭代对象作为参数。

  2. 在内部,map函数会迭代最短的可迭代对象,对应位置上的元素传递给传入的函数进行处理。

  3. 对于每个元素,map函数都会将传入的函数应用到它上面,并将结果保存起来。

  4. 最后,map函数返回一个迭代器,该迭代器包含了所有经过处理后的元素。

考虑到map函数的灵活性和性能要求,Python解释器可能会对其进行优化和调整,以提高其效率和性能。因此,具体的map函数的实现可能会随着Python版本的更新和优化而发生变化。

4.重新实现一下简单的map函数 
class MapIterator:
    def __init__(self, func, *iterables):
        self.func = func
        self.iterables = iterables
        self.iterators = [iter(it) for it in iterables]

    def __iter__(self):
        return self

    def __next__(self):
        try:
            args = [next(it) for it in self.iterators]
            return self.func(*args)
        except StopIteration:
            raise StopIteration

def my_map(func, *iterables):
    return MapIterator(func, *iterables)

# 测试
def add(x, y):
    return x + y

numbers = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]

result = my_map(add, numbers, squares)

for item in result:
    print(item)
5.性能对比(for与map)

 

 

for循环在处理同样的数据用时0.147

map在处理同样的数据用时0.144

 6.总结

map函数将数据序列转化为格式不同,大小相同的序列

map函数并不允许我们有条件地处理数据。它只是将一个函数应用于给定序列的每个元素。

map函数并不是用来替换条件while循环的。它是用来应用函数到序列的每个元素上的工具,而不是替代循环的机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1489158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装mysql5.7

linux安装mysql5.7 一、下载mysql5.7二、解压包介绍三、上传包到linux四、卸载mariadb五、安装mysql六、修改权限七、启动mysql八、使用过navicat创作不易,笔记不易,如觉不错,请三连,谢谢~~ 一、下载mysql5.7 去mysql官方下载&am…

Python解释器及PyCharm安装教程

PyCharm官方下载地址☞https://www.jetbrains.com/pycharm/download/?sectionwindows Python解释器官方下载地址☞ https://www.python.org/downloads/windows/

pytorch续写tensorboard

模型训练到一半有 bug 停了,可以 resume 继续炼,本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例,参考 [1-3],只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

UE5 UE4 关闭/开启引擎开启插件(UE4 MDL资源删除)

问题: 最近遇到了个情况,我安装在UE4.26中的一个NVIDA Omniverse插件,这个插件导致每次生成新的项目时,都会自动开启并在工程中生成一个MDL的文件夹和资源,比较烦。 而且是空工程,也依然自动生成。删除、…

石头里的传奇故事—沉积岩

“ 沉积岩者,地质历史之积淀者也。” 野外发现层状延伸的岩石出露,发现的岩石呈现灰白色,主要矿物为磨圆度好的石英颗粒,石英粒径为1-2mm。岩石质地坚硬。石英颗粒间填充物黏土物质,滴加盐酸未见气泡,斜层…

pytest多重断言插件-pytest-assume

最近准备废弃之前用metersphere做的接口自动化,转战pytest了,先来分享下最近接触到的一个插件:pytest-assume。 在使用这个插件之前,如果一个用例里面有多个断言的话,前面的断言失败了,就不会去执行后面的断…

黑马瑞吉外卖练习笔记

day2 员工管理 完善登录 问题:用户不登录,直接访问系统首页,照样可以正常访问。我们希望,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面 怎么实现? 用过滤器或拦截器,在…

3d模型合并后一片漆黑是什么原因,怎么解决---模大狮模型网

当合并多个3D模型后,发现整个合并后的模型显示为一片漆黑通常是由以下几个可能的原因导致的: 材质设置问题:合并后的模型可能存在材质设置错误,导致模型无法正确显示。检查每个模型的材质属性,确保其正确设置&#xff…

仿生蝴蝶制作——前期材料准备

1.扑翼机控制板 PCB免费,元器件大概50元 2.舵机1906B两个GDW DS1906AB 3.2KG扭力金属齿滑翔机扑翼固定翼8g9g高速数字舵机 3.风筝布p31n追风者风筝544软伞布 仿生蝴蝶P31N DIY面料 210格子布 硅胶伞布 4.遥控器富斯i6X,接收机A8S。 5.碳…

【好书推荐-第七期】《RTC程序设计:实时音视频权威指南》(音视频开发必看!)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:洲与AI。 🎈 本文专栏:本文收录…

新版微交易微盘系统/外汇期货贵金属虚拟币微盘源码

1.环境 nginx 1.16或者 apache2.4 php5.6 Mysql 5.6 2.上传数据库 3.设置伪静态thinkphp就行 4.修改 application/database.php 中 数据库名称,密码 5.后台 域名/admin 账号admin 密码123456 6.前台 域名 账号13999999999密码123456 新版微交易微盘系统/外汇期…

转载-七种Java常用序列化框架的选型与对比

七种Java常用序列化框架的选型与对比 本文章转自:乐字节 文章主要讲解:Java常用序列化框架 获取更多前端相关资料可以点击链接加入群聊【Java技术交流群】:正在跳转暗号:166 转载地址:七种Java常用序列化框架的选型…

Cyber RT 组件

场景 无人车上的传感器数据可能需要被融合,比如在车辆上安装了多颗雷达,不同雷达由于安装位置与自身参数差异,可探测的角度、范围、距离等都是不尽相同的,现在需要将不同雷达感知到的数据融合在一起以建立车辆所处的完整环境&…

SAP 设置后台JOB批量扩充MRP区域

SAP 升级了HANA以后,不良品仓位的控制都是由MRP区域来控制了,当我们创建物料的时候,希望系统能自动扩充物料到NMRP的区域。我们可以通过创建后台JOB,定时的让程序跑后台JOB的方式来扩充物料的MRP区域 1、执行程序—SE38—RMMDDIBE 2、Tcode:MMD1创建MRP参数文件 点击选…

搜索算法(DFS和BFS 蓝桥杯 C++)

目录 题目一(N皇后问题): 代码: 题目二(路径之谜): 代码: 题目三(最大数字): 代码: 题目四(长草)&#…

极简技术 | 能够很方便地解决教学中的实际问题

如今,极简教育技术开始兴盛,作为一种能够很方便地解决教学中的实际问题技术体系,“极简主义”与“教育技术”又能碰撞出什么样的火花呢? 一、教育要“技术化”,也可以“极简化” “极简主义”是一种生活理念或哲学&a…

深入理解Docker

文章目录 1 Docker理论1.1 背景知识1.2 是什么1.3 Docker基本三要素1.4 镜像原理1.5 安装教程 2 Docker常用命令2.0 防火墙相关命令2.1 镜像命令2.2 容器命令2.3 进阶命令 3. 实战之Docker部署springboot项目步骤一:Springboot项目配置1.1 添加docker的maven依赖1.2…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发…

“祖传代码“的是是非非

程序员眼中的“祖传代码”,就像一本古老而神秘的魔法书,藏着无穷的智慧和技巧,有些代码像家传宝贝,有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 祖传代码的历史与文化价值 祖传代码通常指的是经过长时间使用和传承的代…

Linux操作系统——进程信号

1.信号的概念 生活当中哪些场景算信号呢?比如说你晚上调了个闹钟,然后第二天早上你听到了闹钟响了你就知道该起床了,这种机制就叫做信号机制。在生活中我们的信号是非常非常多的,比如说有:红绿灯,下课铃声…