部分和运算符添加的小练习
operator 模块中有add 运算符
>>> from operator import add
>>> add(7, 5)
12
functool 允许 partial 构建新功能
>>> from functools import partial
>>> add5 = partial(add, 5)
>>> add5(7)
12
使用map 将add5 应用于简单的sublst
>>> sublst = [1,2,3]
>>> map(add5, sublst)
[6, 7, 8]
按要求使用嵌套列表
>>> lst = [[1,2,3], [4,5,6]]
>>> [map(add5, sublst) for sublst in lst]
[[6, 7, 8], [9, 10, 11]]
测量执行时间
使用已经准备好的函数add5
>>> %timeit [map(add5, sublst) for sublst in lst]
1000000 loops, best of 3: 1.23 µs per loop
使用建议的答案之一:
>>> [[item+5 for item in sub] for sub in lst]
[[6, 7, 8], [9, 10, 11]]
>>> %timeit [[item+5 for item in sub] for sub in lst]
1000000 loops, best of 3: 658 ns per loop
add5 在我们需要的时候创建:
>>> [map(partial(add, 5), sublst) for sublst in lst]
[[6, 7, 8], [9, 10, 11]]
>>> %timeit [map(partial(add, 5), sublst) for sublst in lst]
1000000 loops, best of 3: 1.5 µs per loop
使num成为变量:
>>> num = 5
>>> [map(partial(add, num), sublst) for sublst in lst]
[[6, 7, 8], [9, 10, 11]]
构建问题所需的功能
>>> def add2lst(num, lst):
... return [map(partial(add, num), sublst) for sublst in lst]
...
经过测试,它可以工作
>>> add2lst(5, lst)
[[6, 7, 8], [9, 10, 11]]
结论 - 太聪明可能会减慢速度
>>> timeit.timeit("[[item+5 for item in sub] for sub in lst]", setup="from functools import partial;from operator import add;lst=[[1,2,3],[4,5,6]]", number=rep)
6.1195290088653564
>>> timeit.timeit("[map(partial(add, 5), sublst) for sublst in lst]", setup="from functools import partial;from operator import add;lst=[[1,2,3],[4,5,6]]", number=rep)
14.058987140655518
使用运算符的智能概念和部分增加的执行复杂性,导致此解决方案比简单解决方案慢两倍以上。
所以:“保持简单”