我需要在列表中处理大量数据,因此一直在研究使用Python的最佳方法。
我想出的主要方法是使用: - 列出理解 - 生成器表达式 - 功能样式操作(地图,过滤器等)
我知道一般来说列表理解可能是最“Pythonic”的方法,但在性能方面最好的是什么?
答案 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
,当您需要列表结果时使用列表解析,否则使用生成器。如果你真的关心性能,你可能会看看你是否真的需要程序中所有点的列表。