2010-06-10 78 views
1
cost=0 
for i in range(12): 
    cost=cost+math.pow(float(float(q[i])-float(w[i])),2) 
cost=(math.sqrt(cost)) 

對此用替代物?我需要改進我的整個代碼,以便提高每個語句的性能。更快的選擇嗎?

感謝ü

+3

您應該考慮運行一個分析器來找出哪些語句花費最多的時間,而不是試圖單獨改進每個*語句。然後,改進你的代碼部分。否則,你只會花費大量時間進行不合理的優化。 – 2010-06-10 05:46:52

+0

我來自哪裏的人很笨拙:我認爲Python分析器在函數/方法級別工作,而不是語句級別。 – 2010-06-10 07:47:50

回答

0

只是一個提示,但通常實際性能的提升來當你評估在函數的代碼,甚至更高的水平。

在良好的評估過程中,您可能會發現整個代碼塊被丟棄或重寫以便簡化過程。

2

除了已經制作的(我訂閱的)一般優化評論之外,是一種更「優化」的做事方式:操縱值的數組並以數學方式組合它們。這是非常有用和廣泛使用的NumPy package的工作!

這裏是你會怎麼做:

q_array = numpy.array(q, dtype=float) 
w_array = numpy.array(w, dtype=float) 
cost = math.sqrt(((q_array-w_array)**2).sum()) 

(如果你的陣列qw已經包含了花車,你可以刪除dtype=float。)

這是幾乎一樣快,因爲它可以得到,因爲NumPy的操作對陣列進行了優化。它比循環更清晰,因爲它既簡單又短。

0

配置文件很有用,在你清理了非常清晰的代碼之後。不管它是運行一次還是運行數十億次,你都不應該這樣寫代碼。

你爲什麼要做float(q[i])float(w[i])q和`w'的元素是什麼類型?

如果x和y是浮點數,那麼x - y也將是一個浮點數,所以這3個float()已經顯然是多餘的。

調用math.pow()而不是使用**運算符將承擔「數學」和「pow」查找的開銷。

等等等等

看看下面的代碼給出了同樣的答案和讀取更好,速度更快:

costsq = 0.0 
for i in xrange(12): 
    costsq += (q[i] - w[i]) ** 2 
cost = math.sqrt(costsq) 

你測試這一點,明白了爲什麼進行了更改後,你可以申請其他Python代碼的教訓。那麼如果你有更多的陣列或矩陣工作要做,請考慮使用numpy

+0

列表中的元素是我的字符串格式,所以必須使用浮點數我猜 – kaushik 2010-06-11 05:17:32

+0

@kaushik:考慮將字符串轉換爲使用(例如)'q = map(float,q)'輸入的浮點數 - 特別是如果它們被使用在多個計算中。 – 2010-06-11 12:21:34