2013-02-11 28 views

回答

4

如果您想要一个较短的解决方案,请考虑使用map()作为内循环,或者甚至两者。但它不可能获得显着的性能提升。但是,for p in l[1]:仍然可能比xrange的建设速度更快。下面的例子应该在单行中做你想做的事:

map(lambda g: map(file_out.write, g), groups.itervalues()) 

现在我们来比较不同实现的性能。在这里,我想对一些测试数据测量时间:

import timeit 

groups = dict(('1037_%d' % i, ["a","b","c","d","e"]) for i in xrange(100)) 

class FOut(object): 
    def write(self, v): 
     #print v 
     pass 

file_out = FOut() 

def using_map(): 
    map(lambda g: map(file_out.write, g), groups.itervalues()) 

def initial_version(): 
    for l in groups.iteritems(): 
     for p in xrange(len(l[1])): 
      file_out.write(l[1][p]) 

def seq_iteration(): 
    for l in groups.iteritems(): 
     for p in l[1]: 
      file_out.write(p) 

def seq_iteration_values(): 
    for l in groups.itervalues(): 
     for p in l: 
      file_out.write(p) 

def list_compr(): 
    [[file_out.write(v) for v in g] for g in groups.itervalues()] 



tests = ('initial_version', 'using_map', 'seq_iteration', 'list_compr', 'seq_iteration_values') 


for test in tests: 
    print test, timeit.timeit('%s()'%test, 'from __main__ import %s'%test, number=10000) 

,其结果是:

initial_version 0.862531900406 
using_map 0.703296899796 
seq_iteration 0.541372060776 
list_compr 0.632550954819 
seq_iteration_values 0.493131160736 

正如你所看到的,你的最初版本是最慢的,固定的迭代有很大帮助,map()版本很短,但速度不及itervalues()。创建不需要列表的列表理解不错,但仍然比简单循环慢。

+0

谢谢Ellioh。我可以问为什么xrange感冒缓慢? – 2013-02-11 15:48:54

+1

因为你做了一个额外的操作:首先从序列中获得一个数字,然后通过索引得到一个值(或者甚至通过两次索引得到值,因为有两个索引)。迭代项目一个接一个是高度优化的,应该稍微快一点。 – Ellioh 2013-02-11 15:50:22

9

循环解析并不一定加快循环。如果最终结果应该是一个列表,它们只会加速一个循环。列表推导比创建一个空列表并将其追加到一个列表更快。

对于您的情况,您希望将项目写入文件,而不是创建新列表。列表创建成本然后被浪费。

虽然您不需要xrange()调用,只需循环l[1]即可。您不需要.iteritems(),因为您忽略了键。使用.itervalues()代替:

for lst in Groups.itervalues(): 
    for p in lst: 
     file_out.write(p) 

我用lst作为循环变量; l很容易混淆在i许多字体中。

+0

亲爱的Martijn谢谢。您的解决方案给我这个错误 回溯(最近呼叫最后): 文件“”,第3行,在 文件“C:\ Python27 \ lib \ site-packages \ liblas \ file.py”,第379行,写入 '为类型liblas.point.Point'%pt) LASException:无法写入2,它必须是类型liblas.point.Point – 2013-02-11 15:33:37

+0

,因为p是“2”而不是liblas.point。点 – 2013-02-11 15:33:58

+0

和lst只是没有元素([“a”,“b”,“c”,“d”,“e”))的关键字('1037_97')) – 2013-02-11 15:37:07

相关问题