1

我有一个字典中的类型(示例)

l =('1037_97',["a","b","c","d","e"])

我希望保存一个文件(las 格式),但Liblas只能写单点。

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

如果可能的话,我正在尝试使用List Comprehensions 以保存代码并加快循环速度

4

2 回答 2

9

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

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

不过,您不需要xrange()调用,只需循环l[1]. 您也不需要.iteritems(),因为您忽略了键。改用.itervalues()

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

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

于 2013-02-11T15:29:41.073 回答
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(). 创建不需要列表的列表理解还不错,但仍然比普通循环慢。

于 2013-02-11T15:47:17.233 回答