cost=0
for i in range(12):
cost=cost+math.pow(float(float(q[i])-float(w[i])),2)
cost=(math.sqrt(cost))
對此用替代物?我需要改進我的整個代碼,以便提高每個語句的性能。更快的選擇嗎?
感謝ü
cost=0
for i in range(12):
cost=cost+math.pow(float(float(q[i])-float(w[i])),2)
cost=(math.sqrt(cost))
對此用替代物?我需要改進我的整個代碼,以便提高每個語句的性能。更快的選擇嗎?
感謝ü
只是一個提示,但通常實際性能的提升來當你評估在函數的代碼,甚至更高的水平。
在良好的評估過程中,您可能會發現整個代碼塊被丟棄或重寫以便簡化過程。
除了已經制作的(我訂閱的)一般優化評論之外,是是一種更「優化」的做事方式:操縱值的數組並以數學方式組合它們。這是非常有用和廣泛使用的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())
(如果你的陣列q
和w
已經包含了花車,你可以刪除dtype=float
。)
這是幾乎一樣快,因爲它可以得到,因爲NumPy的操作對陣列進行了優化。它比循環更清晰,因爲它既簡單又短。
配置文件很有用,在你清理了非常清晰的代碼之後。不管它是運行一次還是運行數十億次,你都不應該這樣寫代碼。
你爲什麼要做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
。
列表中的元素是我的字符串格式,所以必須使用浮點數我猜 – kaushik 2010-06-11 05:17:32
@kaushik:考慮將字符串轉換爲使用(例如)'q = map(float,q)'輸入的浮點數 - 特別是如果它們被使用在多個計算中。 – 2010-06-11 12:21:34
您應該考慮運行一個分析器來找出哪些語句花費最多的時間,而不是試圖單獨改進每個*語句。然後,改進你的代碼部分。否則,你只會花費大量時間進行不合理的優化。 – 2010-06-10 05:46:52
我來自哪裏的人很笨拙:我認爲Python分析器在函數/方法級別工作,而不是語句級別。 – 2010-06-10 07:47:50