这与以下内容有关:(在Python代码中)
for i in object:
doSomething(i)
Run Code Online (Sandbox Code Playgroud)
与
map(doSomething, object)
Run Code Online (Sandbox Code Playgroud)
两者都很容易理解,而且很短,但速度有差异吗?现在,如果doSomething有一个返回值,我们需要检查它是否会从map中返回一个列表,而在for循环中我们可以创建自己的列表或一次检查一个.
for i in object:
returnValue = doSomething(i)
doSomethingWithReturnValue(returnValue)
Run Code Online (Sandbox Code Playgroud)
与
returnValue = map(doSomething, object)
map(doSomethingWithReturnValue, returnValue)
Run Code Online (Sandbox Code Playgroud)
现在,我觉得两者有点分歧.两个doSomethingWithReturnValue函数可能会有所不同,因为如果我们在循环中检查它们,或者如果在最后一次检查它们会产生不同的结果.此外,似乎for循环总是有效,也许更慢,地图只能在某些情况下工作.当然,我们可以做出扭曲来使其中任何一种工作,但重点是避免这种类型的工作.
我正在寻找的是这样一种情况,即与性能,可读性,可维护性或实施速度方面的循环相比,映射功能真正发挥作用.如果答案确实没有太大差异,那么我想知道在实践中人们何时使用其中一个或者它是否真的完全随意并且根据您的机构根据编码标准设置.
谢谢!
Lar*_*abe 28
map当您想要将函数应用于iterable的每个项目并返回结果列表时,此选项非常有用.这比使用for循环和构造列表更简单,更简洁.
for对于其他情况,它通常更具可读性,并且在lisp中有许多基本上使用宏和映射编写的迭代构造.因此,在map不适合的情况下,使用for循环.
从理论上讲,如果我们有一个足够智能的编译器/解释器来使用多个cpus /处理器,那么map可以更快地实现,因为每个项目的不同操作可以并行完成.但是,我认为目前情况并非如此.
Mar*_*nen 16
你熟悉timeit模块吗?以下是一些时间安排.-s执行一次性设置,然后循环命令并记录最佳时间.
1> python -m timeit -s "L=[]; M=range(1000)" "for m in M: L.append(m*2)"
1000 loops, best of 3: 432 usec per loop
2> python -m timeit -s "M=range(1000);f=lambda x: x*2" "L=map(f,M)"
1000 loops, best of 3: 449 usec per loop
3> python -m timeit -s "M=range(1000);f=lambda x:x*2" "L=[f(m) for m in M]"
1000 loops, best of 3: 483 usec per loop
4> python -m timeit -s "L=[]; A=L.append; M=range(1000)" "for m in M: A(m*2)"
1000 loops, best of 3: 287 usec per loop
5> python -m timeit -s "M=range(1000)" "L=[m*2 for m in M]"
1000 loops, best of 3: 174 usec per loop
Run Code Online (Sandbox Code Playgroud)
请注意,除了最后两个,它们都是相似的.函数调用(L.append,或f(x))严重影响时序.在#4中,L.append查找已在设置中完成一次.在#5中,使用没有函数调用的列表comp.
只使用列表推导:它们更加pythonic.它们也具有类似于生成器表达式的语法,这使得从一个表达式切换到另一个表达式变得容易.将代码转换为py3k时无需更改任何内容:map在py3k中返回一个可迭代的内容,您将不得不调整代码.
如果你不关心返回值只是不要命名新列表,你需要在代码中使用一次返回值,你可能会切换到生成器表达式和最后一个列表理解.
| 归档时间: |
|
| 查看次数: |
37580 次 |
| 最近记录: |