2010-06-19 62 views
0

我需要处理列表中的大量数据,因此一直在研究如何使用Python来完成此操作的最佳方式。优化列表操作

我已经想出了正在使用的主要途径有: - 列表解析 - 发电机表达式 - 功能性风格的操作(地图,过滤器等)

我大致知道列出内涵是可能是最“ Pythonic“方法,但是在性能方面什么是最好的?

+0

这取决于你的问题当然。 – KillianDS 2010-06-19 12:13:50

+0

对不起,这是有点回顾它。生病会做很多不同的事情,过滤各种属性;根据正则表达式检查字符串列表的格式,在列表中的每个项目上调用各种函数。对不起,它有点模糊 – 2010-06-19 12:21:50

+0

和你想要做的不同事情的答案会有所不同。你有没有更具体的问题? – Duncan 2010-06-19 13:59:12

回答

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 

对于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,当您需要列表结果时使用列表理解,否则使用生成器。如果你真的关心性能,你可以看看你是否真的需要在你的程序中的所有点列表。