我有一个字典中的类型(示例)
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 以保存代码并加快循环速度
我有一个字典中的类型(示例)
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 以保存代码并加快循环速度
循环推导不一定会加速循环。如果最终结果应该是一个列表,它们只会加速循环。列表推导比创建一个空列表并一一追加要快。
在您的情况下,您希望将项目写入文件,而不是创建新列表。然后浪费了列表创建成本。
不过,您不需要xrange()
调用,只需循环l[1]
. 您也不需要.iteritems()
,因为您忽略了键。改用.itervalues()
:
for lst in Groups.itervalues():
for p in lst:
file_out.write(p)
我用作lst
循环变量;在许多字体中l
很容易混淆。i
如果您想要更短的解决方案,请考虑使用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()
. 创建不需要列表的列表理解还不错,但仍然比普通循环慢。