Is this simplified version of map/lambda in python?
对于数组为a = [1, 2, 3, 4]的map/lambda表达式:
1
| f = map(lambda x : x + 32, a) |
似乎我可以简化写作:
我想知道是否有什么不同。
- 如果最终目标是获得一个带有修改值的列表,那么会有一些速度差(第一种情况是list(map(lambda x : x + 32, a)))
- 性能比较
- 顺便说一句,这与MapReduce无关……
lambda往往是导致函数开销的较慢原因。此外,lambda也会使代码更难阅读。您还可以计时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/usr/bin/env python
import time
a = [1, 2, 3, 4]
t1 = time.time()
f = map(lambda x : x + 32, a)
t2 = time.time()-t1
print t2
t3 = time.time()
g = [x + 32 for x in a]
t4 = time.time()-t3
print t4 |
此代码返回:
1 2
| 7.86781311035e-06
2.14576721191e-06 |
同样,我也尝试了同样的方法来处理更大的列表,对于lambda表达式,所花费的时间几乎是原来的两倍。
1 2 3 4 5 6 7
| python -m timeit '[x + 32 for x in range(100000)]'
>> 100 loops, best of 3: 6.67 msec per loop
python -m timeit 'map(lambda x : x + 32, range(100000))'
>> 100 loops, best of 3: 12.5 msec per loop |
这是性能上的巨大差异。
- KeEnthApababaKaLa的表演一直是一个需要考虑的大事。看上面的指标,我也喜欢兰姆达斯,但他们往往是缓慢的。
- @基尔塔纳普拉巴卡兰还有什么比单子理解更像Python的?"可读性很重要"—很多!
- @keerthanaprabhakaran但是lambda不将代码划分为函数,它使用匿名函数。
- @弗兰克,这不是一个很好的时间比较。你真的应该使用timeit,但更重要的是,你使用的是一个非常短的列表,所以你的大部分差异实际上只是两种方法的不同管理费用。
- @Miraj50非常感谢!
- 慢吗?我的测试显示,否则[prateek@localhost pythonista]$python-mtimeit-s'a=[1,2,3,4]''map(lambda x:x+2,a)'1000000个循环,每个循环最好使用3:0.189个USEC[prateek@localhost pythonista]$python-mtimeit-s'a=[1,2,3,4]''[x+32 for x in a]'1000000个循环,每个循环最好使用3:0.291个USEC[prateek@localhost pythonista]
- 我明白了。我明白了。但是lambda只是Python中的匿名函数!至于性能,尝试在for循环中运行相同的代码。在那里使用map和lambda似乎更好。
- @基尔塔纳普拉巴卡兰人可以通过简单的规则来安逸自己的生活(以及与他人共同编码的生活)。不把代码库与lambda污染的map和filter表达式混在一起是其中之一;)
- 真的。对于更简单的情况,一个简单的列表理解可能就足够了。但我的意思是在更大的范围内编程,性能才是真正重要的。
- @Keerthanaprabhakaran在我自己的测试和你在这里看到链接的测试中倾向于显示列表理解更快,除了映射内置函数,例如list(map(float, seq_of_int))。
- @丢失的化身你在python 2上吗?在python 3上,您需要list(map(...)),无论如何,这些测试几乎毫无价值!a的长度是4!
- 我已经用了两种方法!而且,只有当代码需要执行几次时,列表理解才会更快。