优化列表上的操作

时间:2010-06-19 11:55:29

标签: python performance list

我需要在列表中处理大量数据,因此一直在研究使用Python的最佳方法。

我想出的主要方法是使用:   - 列出理解   - 生成器表达式   - 功能样式操作(地图,过滤器等)

我知道一般来说列表理解可能是最“Pythonic”的方法,但在性能方面最好的是什么?

1 个答案:

答案 0 :(得分:1)

受到这个答案的启发:Python List Comprehension Vs. Map,我调整了问题,以便比较生成器表达式:

对于内置插件:

$ python -mtimeit -s 'import math;xs=range(10)' 'sum(map(math.sqrt, xs))'
100000 loops, best of 3: 2.96 usec per loop
$ python -mtimeit -s 'import math;xs=range(10)' 'sum([math.sqrt(x) for x in xs)]'
100000 loops, best of 3: 3.75 usec per loop
$ python -mtimeit -s 'import math;xs=range(10)' 'sum(math.sqrt(x) for x in xs)'
100000 loops, best of 3: 3.71 usec per loop

对于lambdas:

$ python -mtimeit -s'xs=range(10)' 'sum(map(lambda x: x+2, xs))'
100000 loops, best of 3: 2.98 usec per loop
$ python -mtimeit -s'xs=range(10)' 'sum([x+2 for x in xs])'
100000 loops, best of 3: 1.66 usec per loop
$ python -mtimeit -s'xs=range(10)' 'sum(x+2 for x in xs)'
100000 loops, best of 3: 1.48 usec per loop

列出清单:

$ python -mtimeit -s'xs=range(10)' 'list(map(lambda x: x+2, xs))'
100000 loops, best of 3: 3.19 usec per loop
$ python -mtimeit -s'xs=range(10)' '[x+2 for x in xs]'
100000 loops, best of 3: 1.21 usec per loop
$ python -mtimeit -s'xs=range(10)' 'list(x+2 for x in xs)'
100000 loops, best of 3: 3.36 usec per loop

当与内置函数配对时,map似乎是最好的,否则,生成器表达式会超出列表推导。除了稍微清晰的语法之外,生成器表达式还可以节省大量内存而不是列表推导,因为它们被懒惰地评估。因此,在没有针对您的应用程序的特定测试的情况下,您应该使用内置的map,当您需要列表结果时使用列表解析,否则使用生成器。如果你真的关心性能,你可能会看看你是否真的需要程序中所有点的列表。