2013-07-22 23 views
2

我有一個名爲'run'的列表。我創建使用我的這部分代碼的名單平均:列表中的平均列表 - 是否有更有效的方法?

ave = [0 for t in range(s)] 
for t in range(s): 
    z = 0 
    for i in range(l): 
     z = z + run[i][t] 
     #Converted values to a string for output purposes 
     # Added \n to output 
     ave[t]= ((str(z/l) + "\n")) 

出乎我的意料,這個代碼工作的第一次,我寫的。我現在正計劃處理更大的列表和更多的價值,並且可能會出現性能問題。這種在計算資源使用方面寫作平均效率低下的方法,我如何編寫更高效的代碼?

+0

這看起來漸近好的。除非z溢出。 (以避免閱讀http://www.johndcook.com/standard_deviation.html),但內置函數在實踐中可能更快更清晰。 – Jacob

回答

4

列表理解可能更有效。

>>> run = [[1, 2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12, 13]] 
>>> [sum(elem)/len(elem) for elem in zip(*run)] 
[5.666666666666667, 6.666666666666667, 7.666666666666667, 8.666666666666666] 

或者,你可以嘗試map()

>>> list(map(lambda x: sum(x)/len(x), zip(*run))) 
[5.666666666666667, 6.666666666666667, 7.666666666666667, 8.666666666666666] 
+0

您正在對錯誤的軸進行平均。另外,Python 3. – user2357112

+0

哎呀!固定。謝謝。 :) –

3

可以通過讓Python的提高效率做更多的工作,爲您提供高效的內置函數和list解析:

averages = [sum(items)/len(run) for items in zip(*run)] 
1
import numpy as np 
ave = [np.avg(col) for col in zip(*run)] 

OR

ave = [sum(col)/len(col) for col in zip(*run)] 
+0

我沒有在文檔中看到'itertools.zip',這引入了'numpy'依賴。 – user2357112

+0

感謝bugreport @ user2357112。它是固定的。 'numpy'依賴性是爲了利用numpy提供的效率,至少與沒有它的平均效率一樣快。 – inspectorG4dget

+0

我仍然在這裏看到'itertools.zip'。那應該是什麼? (當你在它,這是一個奇怪的方式來使用numpy的。你爲什麼不使用'numpy.average(運行,0)'?) – user2357112

相關問題