2014-05-22 41 views
1

我們真的很感激任何幫助,因爲我們使用C語言讓我們的程序變得更加快速。Python編織加快我們的代碼

獲得不改變的值,始終是0,0,0,0

下面是代碼,在Linux上運行:

from scipy import weave 

pasa = 0 
coorX = -11.8 
coorY = -7.9 
INC=0.01296 
##def weave_update(): 

code=""" 
int i,j, pasa; 
double coorX, coorY,INC; 

for (i=0; i < 1296;i++){ 

    yminf = coorY + INC*(i); 
    ymaxf = yminf + INC; 

    for (j=0; j < 1936;j++){ 

     xminc = coorX + INC*(j); 
     xmaxc = xminc + INC; 
     pasa = 1; 
     break; 
    } 
    if (pasa == 1){ 
    break; 
    } 
} 
""" 
weave.inline(code,['yminf','xminc','xmaxc','ymaxf'],type_converters=weave.converters.blitz,compiler='gcc') 
print yminf,xminc,xmaxc,ymaxf 
+0

不要使用編織,它是無人維護。新的代碼應該使用Cython來代替:cython.org – Davidmh

回答

2

看起來像兩個問題。首先,您需要傳入C代碼需要從python訪問的所有變量。所以,你的電話inline必須:

weave.inline(code, ['coorX','coorY','INC']) 

其次,你需要回到你從編織代碼需要的值,因爲在C對其進行修改並不影響其在Python值。下面是做這件事:

py::tuple ret(4); 
ret[0] = yminf; 
ret[1] = xminc; 
ret[2] = xmaxc; 
ret[3] = ymaxf; 
return_val = ret; 

有了這些修改,以下文件似乎正常工作:

from scipy import weave 

coorX = -11.8 
coorY = -7.9 
INC = 0.01296 

code=""" 
int i,j, pasa = 0; 
double yminf,xminc,xmaxc,ymaxf; 

for (i=0; i < 1296;i++){ 

    yminf = coorY + INC*(i); 
    ymaxf = yminf + INC; 

    for (j=0; j < 1936;j++){ 

     xminc = coorX + INC*(j); 
     xmaxc = xminc + INC; 
     pasa = 1; 
     break; 
    } 
    if (pasa == 1){ 
    break; 
    } 
} 
py::tuple ret(4); 
ret[0] = yminf; 
ret[1] = xminc; 
ret[2] = xmaxc; 
ret[3] = ymaxf; 
return_val = ret; 
""" 
yminf,xminc,xmaxc,ymaxf = weave.inline(code,['coorX','coorY','INC']) 
print yminf,xminc,xmaxc,ymaxf 
+0

拋開編織調用問題,我認爲C代碼在第一次迭代之後正在退出兩個循環... – Jaime