代码之家  ›  专栏  ›  技术社区  ›  Jim Jeffries

优化列表上的操作

  •  0
  • Jim Jeffries  · 技术社区  · 14 年前

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

    我想到的主要方法是: -列出理解 -生成器表达式 -功能样式操作(映射、筛选等)

    我知道通常列表理解可能是最“蟒蛇”的方法,但在性能方面最好的是什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    7 年前

    受此答案启发: 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
    

    兰贝达:

    $ 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 最好与内置函数配对,否则,生成器表达式会击败列表理解。除了稍微更干净的语法之外,生成器表达式还比列表理解节省了很多内存,因为它们的计算比较慢。因此,如果您的应用程序没有特定的测试,您应该使用 地图 使用内置函数,当您需要一个列表结果,或者一个生成器时,一个列表理解。如果你真的关心性能,你可以看看你是否在程序的所有点上都需要列表。