2013-03-31 11 views
1

我正在研究一個理論圖論問題,它涉及到hypergrapha中的hyperedges組合來分析各種情況。使用cython或PyPy來優化元組/列表(在python中實現的圖論算法)

我已經在Python中實現了主算法的初始版本,但由於它的組合結構(可能是我的實現),算法很慢。

我正在考慮加快速度的一種方法是使用PyPy或Cython。

看看文檔,看起來Cython在元組方面沒有提供很好的加速。這可能對實現有問題,因爲我將hyperedges表示爲元組 - 所以該算法的大部分操作元組(但是它們都是相同的長度,每個len 6左右)。

由於我的C和Python技能都非常小,我將不勝感激,如果有人可以建議什麼是繼續優化代碼的最佳方式,因爲它依賴於元組/列表。是否有使用Cython(或PyPy)的列表/元組的文檔?

+0

你可以發佈你的代碼並突出顯示緩慢的部分?如果沒有看到代碼,很難提出改進建議,因爲問題可能不是您想象的那樣。在_general_中,提高速度的最佳答案是想一個更好的算法...... –

+0

Cython可以使用C數組和結構,並且可以定義擴展類型。其中任何一個都可以替代元組。 –

+0

@Roland,算法實際上是NP(它與超圖中的匹配有關),所以我不能希望得到比我已經實現的算法更優化的算法。但是,我只對一個非常具體的案例感興趣。我從Python的天真實施的運行時間估算,如果我能使它運行速度提高100倍,那麼這將使它在可接受的時間內(約2周)完成。 – nsimplex

回答

1

什麼是優化的代碼,最好的方法......

Profile first。有一個標準的cProfile模塊可以很好地進行簡單的分析。在分析之前優化你的代碼是毫無意義的。

此外,對於圖表,您可以嘗試使用優秀的networkx模塊。此外,如果您處理長排序列表,您可以查看bisectheapq模塊。

+0

謝謝Jakub。分析器很有用,我之前運行它,通過使用它,我估計我需要使函數的速度提高100倍,以便在可接受的時間內完成代碼以實現我的目的。我也看過你提到的圖論組件,而且它們確實很棒。然而,我沒有使用它們,因爲就圖論算法而言,我只需要在超圖中進行匹配,並且我必須以特定方式實現它,以便能夠使用幾個快捷方式。 – nsimplex

1

如果你的算法在計算複雜性方面不好,那麼你不能保存,你需要寫得更好。請教一本好的圖論或維基百科,它通常比較容易,儘管有一些既不平凡又瘋狂難以實現的算法。這聽起來像是PyPy可以非常顯着地加速,但只有常量因素,但它不涉及您的代碼的任何修改。沒有類型聲明,Cython不會加快你的代碼的速度,看起來像這樣的問題不能僅僅通過類型加速。如果算法的複雜度增長如2^n(這對於一個樸素算法是典型的),那麼向圖中添加額外的節點會使您的時間加倍。這意味着10個節點增加了1024個時間段,20個節點的1024 * 1024等。如果你非常幸運,PyPy可以將算法加速100倍,但是這對圖形大小保持不變(並且你很快就會離開宇宙時間這樣或那樣)。

+0

謝謝fjal。事實上,我需要的只是100倍的加速。我提出的問題是關於數據類型的問題。我如何聲明C中的python元組以獲得最大加速比。如何做到這一點的例子將不勝感激。 – nsimplex

+0

你令人困惑的事情。很多。只需使用PyPy。 PyPy不像Cython - 你不需要定義任何東西,它應該可以工作。 – fijal