优化列表操作
问题描述:
我需要处理列表中的大量数据,因此一直在研究如何使用Python来完成此操作的最佳方式。优化列表操作
我已经想出了正在使用的主要途径有: - 列表解析 - 发电机表达式 - 功能性风格的操作(地图,过滤器等)
我大致知道列出内涵是可能是最“ Pythonic“方法,但是在性能方面什么是最好的?
答
通过这个答案的启发: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
对于lambda表达式:
$ 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
,当您需要列表结果时使用列表理解,否则使用生成器。如果你真的关心性能,你可以看看你是否真的需要在你的程序中的所有点列表。
这取决于你的问题当然。 – KillianDS 2010-06-19 12:13:50
对不起,这是有点回顾它。生病会做很多不同的事情,过滤各种属性;根据正则表达式检查字符串列表的格式,在列表中的每个项目上调用各种函数。对不起,它有点模糊 – 2010-06-19 12:21:50
和你想要做的不同事情的答案会有所不同。你有没有更具体的问题? – Duncan 2010-06-19 13:59:12