python列表推导为什么快

作者&投稿:冀馥 (若有异议请与网页底部的电邮联系)
~ 首先,确认 map 和列表推导确实比循环高效。以下是我在 ipython 中的测试结果(Python 2.7.10 环境):
对于列表推导:
```python
long_list = range(1000)
a = []
%timeit [i+1 for i in long_list]
```
结果为:10000 次循环,最佳 3 次的平均时间为 43.3 微秒。
对于 for 循环:
```python
long_list = range(1000)
a = []
%timeit for i in long_list: a.append(i+1)
```
结果为:10000 次循环,最佳 3 次的平均时间为 100 微秒。
列表推导比 for 循环快的原因在于其执行效率。通过 Python 的 dis 模块查看字节码,我们可以发现列表推导和 for 循环的执行过程非常相似,差异在于元素添加的方式。列表推导直接使用 `LIST_APPEND` 字节码,而 for 循环则需要每次都调用 `append` 方法。这导致 for 循环的效率相对较低。
为了验证这一点,我们将 `append` 方法赋值给一个局部变量:
```python
long_list = range(1000)
a = []
invoke = a.append
%timeit for i in long_list: invoke(i+1)
```
结果为:10000 次循环,最佳 3 次的平均时间为 67.2 微秒。这表明将 `append` 方法调用替换为直接赋值可以显著提高效率,证实了列表推导的效率优势。
至于 map 函数,通常它比循环快,但有时情况可能不同。例如:
```python
%timeit map(lambda x: x+1, long_list)
```
结果为:10000 次循环,最佳 3 次的平均时间为 109 微秒。
然而,如果使用 C 语言内置的加法操作符或 `__add__` 方法,map 函数可以变得非常快:
```python
int_object = 1
%timeit map(int_object.__add__, long_list)
```
结果为:10000 次循环,最佳 3 次的平均时间为 41.6 微秒。
这是因为 lambda 函数生成的 Python 函数比直接调用 C 语言层面的方法慢。如果将列表推导中的 `+` 换成 lambda 表达式,两者的速度差异不大,有时 map 甚至稍微快一点。
综上所述,map 函数之所以快,是因为其调用的是底层的 C 函数。简而言之,避免使用 lambda 函数时,map 函数的性能可以非常出色。


python开发复试面试什么?
1. 编程能力:面试官会根据候选人的简历和经验询问相关的编程问题,以测试候选人的编程能力。可能会涉及到基本的数据结构和算法、面向对象编程、异常处理、文件操作、多线程\/多进程等方面的内容。2. Python语言特性和库的应用:面试官会询问Python语言的特性和常用的库,例如列表推导式、生成器、装饰器、...

如何管理python爬虫数据多少?
现在,如果你真的要用Python进行大数据分析的话,毫无疑问你需要了解Python的语法,理解正则表达式,知道什么是元组、字符串、字典、字典推导式、列表和列表推导式——这只是开始。 数据分析流程 一般可以按“数据获取-数据存储与提取-数据预处理-数据建模与分析-数据可视化”这样的步骤来实施一个数据分析项目。按照这个流程...

python为什么做数据分析好
究其原因,主要有以下几点:①Python的语法简单,代码可读性高,易于上手,有利于初学者学习;当我们处理数据时,我们希望使数据数字化并将其转换为计算机可以操作的数字形式。我们可以直接使用一个行列表推导来完成,这非常简单。②Python在数据分析和交互,探索性计算和数据可视化方面拥有非常成熟的库和活跃的...

python培训都学哪些知识?
不同的Python培训机构学习的内容不同。如需学习Python推荐选择【达内教育】,该机构双模式项目教学小程序开发到名企项目全案。可先就业后付款,保险公司承保,不就业理赔学费。Python培训知识具体如下:1、Python核心编程:主要是学习Python语言基础、Linux、MySQL。前期学习【Python编程语言】基础内容,中期主要...

列表是什么意思
列表就是数据排列的形式,集合,字典也是一样的。为了构建列表、集合或字典,Python 提供了名为“显示”的特殊句法,每个类型各有两种形式。1.第一种是显式地列出容器内容。2.第二种是通过一组循环和筛选指令计算出来,称为推导式。列表、元组、字典的区别:1、元组是不可变的,而列表、字典是可以改变...

Python学不好怎么办?
6.基本的字典操作方法 以上这些可以略微掌握之后就进行下一步,遇到忘记不会的可以再参考一下书和笔记。三、掌握Python的条件、循环和相关的执行语句 任何知识它的基础知识都是有些枯燥的,现在我们就可以动手来做一些逻辑层面的东西了。掌握if、else、elif、while、for、continue、break和列表推导式等这些...

python中怎么用for循环计算奇数的和?
这里一个涉及到for循环的使用,另外一个涉及到如何判断奇数。下面直接给出图片来说明:求begin到end之间的奇数和

python中^是什么意思
在Python" \/\/ "表示整数除法。Python其它表达式:Python的表达式写法与C\/C++类似。只是在某些写法有所差别。主要的算术运算符与C\/C++类似。+, -, *, \/, \/\/, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取余。>>, <<表示右移和左移。&, |, ^表示二...

django和drf学哪个(2023年最新解答)
推导式??列表推导式 推导式题 集合_字典推导式 生成器表达式 生成器函数? 内置方法,linux基本命令??内置函数 可滑动序列 面试题演练 linux安装 linux基本命令? python模块??序列化模块 数学模块 随机模块 time模块? python模块??os模块 os_shutil os.path模块 计算文件夹大小 zipfile tarfile? 导入模块包,oop面向...

如何从零开始学python
新手学Python可以按照以下步骤进行:1. 按部就班敲代码 在Python的学习教程中,在讲到相应的语法规则的时候,必定有相应的案例,Python新手应按部就班的敲一遍代码,切记不可直接抄写,而是默写,然后进行对比,及时发现错误,并订正。2. 阶段案例实操 对于正规的Python学习教程中,会安排阶段性的作业考核...

安仁县13257598492: python 列表推导 为什么快 -
颛秦磷酸: 首先肯定 map 和列表推导效率确实会比循环的高,先说列表推导,下边是我在 ipython 里的测试结果(测试环境 Python 2.7.10):>>> long_list = range(1000)>>> a = []>>> %timeit for i in long_list: a.append(i+1)10000 loops, best of 3: ...

安仁县13257598492: 想请教一下,为什么python用列表解析创建的列表不能修改..否则报错? -
颛秦磷酸: 你的列表是1维的,你用2维去操作.a=[[None,None] for i in range(8) for j in range(8)] 这样才是2维的

安仁县13257598492: Python中list和set的区别 -
颛秦磷酸: list是列表,有序的,元素可重复的.set是集合,无序的,元素不可重复的.就效率而言,当判断其中是否有某个值的,数据去重合并时候用set更快.list多处理序数相关的事物

安仁县13257598492: Python为什么元组比列表操作速度快 -
颛秦磷酸: 元组支持的操作比列表小, 所以元组会比列表稍稍快上那么一丢丢,主要是“Tuples are immutable, lists are mutable.”

安仁县13257598492: Python 列表推导式怎么理解的呢? -
颛秦磷酸: 5.1.3. 列表推导式 列表推导式为从序列中创建列表提供了一个简单的方法.普通的应用程式通过将一些操作应用于序列的每个成员并通过返回的元素创建列表,或者通过满足特定条件的元素创建子序列. 例如, 假设我们创建一个 squares 列表...

安仁县13257598492: python中List,Queue等数据结构存储效率哪个更优 -
颛秦磷酸: python中的数据结构有:set,list,Queue,dict,tuple等;效率问题,主要看你使用场景:比如要判断一个值是否存在,set肯定快,应为是使用hash,如果保持数据的顺序性:当时list和Queue,但是list不是线程安全的,但是Queue是,tuple是不可变的 dict是字典,和json差不多,使用于key-value类型,效率也比较高;所以主要根据使用场景去选择合适的数据结构,每种数据结构的存在都是有他的应用空间,不然效率低的早就淘汰了.

安仁县13257598492: 为什么numpy的array那么快 -
颛秦磷酸: numpy的许多函数不仅是用C实现了,还使用了BLAS(一般Windows下link到MKL的,Linux下link到OpenBLAS).基本上那些BLAS实现在每种操作上都进行了高度优化,例如使用AVX向量指令集,甚至能比你自己用C实现快上许多,更不要说和用Python实现的比..

安仁县13257598492: [python]关于python的迭代器和列表推导的问题 -
颛秦磷酸: 这句相当于 count = 0 a = [] while True: count += 1 if count 显然是个死循环 问题出在你的迭代类里没有终止条件 class numCounter: 'this is a class to simulate a counter' def __init__(self,max=10): self.max = max self.count=0 def __next__(self): self....

安仁县13257598492: Python 中的列表 List 是可以改变的, 元组 Tuple 是不可以改变的, 那什么情况下要用到 tuple 呢? -
颛秦磷酸: Tuple 是不可变 list. 一旦创建了一个 tuple 就不能以任何方式改变它.Tuple 与 list 的相同之处定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号. Tuple 的元素与 list 一样按定义的次序进行排序. Tuples 的索...

安仁县13257598492: python的list是数组的结构还是链表的结构 -
颛秦磷酸: scores是数组所以scores[index]快,如果scores是链表的话要还要挨个遍历所以scores[index]慢. 从这点来说你的理解是对的,链表找第几个确实比数组找第几个慢得多.因为链表要挨个遍历,数组直接取偏移地址就好了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网