我有一本字典(例如)一类的Python:为了使用,而不是循环列表解析来提高性能
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])
我想使用如果可能的话一个列表综合,以节省代码和加快循环
我有一本字典(例如)一类的Python:为了使用,而不是循环列表解析来提高性能
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])
我想使用如果可能的话一个列表综合,以节省代码和加快循环
如果您想要一个较短的解决方案,请考虑使用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()
。创建不需要列表的列表理解不错,但仍然比简单循环慢。
循环解析并不一定加快循环。如果最终结果应该是一个列表,它们只会加速一个循环。列表推导比创建一个空列表并将其追加到一个列表更快。
对于您的情况,您希望将项目写入文件,而不是创建新列表。列表创建成本然后被浪费。
虽然您不需要xrange()
调用,只需循环l[1]
即可。您不需要.iteritems()
,因为您忽略了键。使用.itervalues()
代替:
for lst in Groups.itervalues():
for p in lst:
file_out.write(p)
我用lst
作为循环变量; l
很容易混淆在i
许多字体中。
亲爱的Martijn谢谢。您的解决方案给我这个错误 回溯(最近呼叫最后): 文件“
,因为p是“2”而不是liblas.point。点 – 2013-02-11 15:33:58
和lst只是没有元素([“a”,“b”,“c”,“d”,“e”))的关键字('1037_97')) – 2013-02-11 15:37:07
谢谢Ellioh。我可以问为什么xrange感冒缓慢? – 2013-02-11 15:48:54
因为你做了一个额外的操作:首先从序列中获得一个数字,然后通过索引得到一个值(或者甚至通过两次索引得到值,因为有两个索引)。迭代项目一个接一个是高度优化的,应该稍微快一点。 – Ellioh 2013-02-11 15:50:22