2013-02-11 27 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

相關問題