2013-01-10 22 views
0

我有一個用IDL(交互式數據語言)編寫的項目,用於通過同化一堆不同的數據輸入來生成電離層的近實時模型。 IDL並不是一個很好的語言,但它主要是因爲遺留代碼。儘管IDL中的對象環境相對有限,但該項目仍以OO風格編寫。使用C/C++擴展在Python中編寫優化項目的提示?

這個項目的下一代的範圍要大得多,需要更多的計算咕嚕聲。 IDL支持多線程,並且不支持在分佈式內存系統上並行運行。最初的計劃是用C++編寫下一代代碼並使用MPI進行並行化,但是最近我開始學習Python,並且對易用性和快速開發和維護代碼的能力印象深刻。我正在考慮使用Python編寫此項目的高級部分,並在需要時使用C擴展來改進核心編號處理部分的優化。

因爲我是Python新手,對於我來說,Python可能會比C版本慢(我也可能會在Python中以次優的方式做事情直到我學習它的特質)。這意味着我會考慮基本上規劃整個項目,就好像要用Python完成所有項目一樣,編寫代碼,配置文件並重復優化,直到我無法進行更多改進,然後再用最慢的部分替換C擴展。

這是一個很好的方法嗎?有沒有人有開發這種項目的任何提示?我會考慮利用盡可能多的現有優化庫(例如scaLAPACK),這樣也可以減少我自己的基於C的擴展的需求,以便進行數字處理。

+2

你知道[numpy的和SciPy的(HTTP的: //www.scipy.org)?這些爲Python提供類似Matlab的數字/矢量編程。在沒有Numpy的情況下在Python中進行數字運算就像騎着方形車輪的自行車。另外,[Cython](http://cython.org)使編寫C擴展更容易。你可能不需要寫一行C;在scikit-learn項目中,我們在Cython中實現了幾種機器學習算法。 –

+0

是的,我知道Numpy和Scipy,我已經安裝了兩個,但還沒有使用它們,但肯定打算。我應該在問題中指出這一點。雖然我並沒有意識到Cython,但是這對我的目的來說非常有用,謝謝。 – Bogdanovist

+0

我已經完全按照您描述的方式實現了一個相當認真的軟件,使用Python爲建築師提供了許多numpy,然後只在需要進行優化時才下降到C。我最初使用ctypes,但現在我會毫不猶豫地使用Cython。 Cython的一大優點是你可以使用基本上純粹的python編寫,然後進行增量優化(查看[cython numpy tutorial](http://docs.cython.org/src/tutorial/numpy.html))。這個發展模式非​​常棒,我強烈支持它。花一些時間去掌握Numpy,因爲它是一個非常有能力的圖書館。 –

回答

2

Python是特別慢,當你做了很多循環,特別是嵌套循環

for i in x: 
    for j in y: 
     .... 

當談到計算密集型的問題,存在的問題99%可以通過做矢量計算與numpy的,而不是循環來解決,例如:

x = np.arange(1000) #numbers from 0 to 999 
y = np.arange(1000, 2000) #numbers from 1000 to 1999 

# slow: 
for i in range(len(x)): 
    y[i] += x[i] 

# fast: 
y += x 

對於許多科學問題,有二進制庫,用FORTRAN或C(++)編寫,可用Python提供。這使生活變得非常簡單。

如果你到了一個地步,這是不可能的,我會堅持用Cython輕鬆地實現在C核心部件,而無需編寫C.