用Cython功能我想轉換原來的Python功能的一部分,用Cython提高了計算時間。我想爲循環組件編寫一個cython函數,因爲它佔用了時間(正如ipython lprun慷慨地告訴我的那樣)。然而,這個函數需要不同大小的矩陣..我看不出如何輕鬆地將它們傳遞給靜態類型的cython。可變大小的矩陣輸入
for index1 in range(0,num_products):
for index2 in range(0,num_products):
cond_prob = (data[index1] * data[index2]).sum()/max(col_sums[index1], col_sums[index2])
prox[index1][index2] = cond_prob
此問題是由於num_products每年都會發生變化,所以矩陣(數據)大小是可變的。
什麼是最好的策略嗎?
- 我應該寫兩個C函數。一個使用memalloc創建一個特定維度的矩陣,然後一個在所創建的矩陣上執行循環?
- 在這種情況下是否有一些花哨的cython/numpy巫術來幫助?我可以編寫一個C函數來獲取內存中可變大小的Numpy Array並傳遞大小嗎?
喜還用Cython你可以做的東西像num_products = data.shape [0]或類似的,所以你的循環的長度將適合你。不過,我不太確定你將要改進循環的方式將會非常有用,因爲你在cython循環中使用了numpy函數。你在努力做什麼似乎非常直截了當......以上表達式是你的原始python代碼?因爲如果是這樣,你可以通過忽略for循環來優化它,從而使其更快。 – Magellan88
有幾個問題:數組'data'和'prox'的「形狀」是什麼?他們都是數組嗎? 'num_products'通常有多大? –
感謝您的意見。好點重新:矢量化而不是循環numpy數組!數據=(170 x 800),因此prox是800 x 800 – sanguineturtle