我有一本字典(例如)一類的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