SWIG

2011-03-09 13 views
6

के साथ C++ फ़ंक्शन में पाइथन सरणी पास करना मैंने पायथन में एक अच्छा कोड लिखा है और यह बहुत अच्छा काम करता है। लेकिन अब मैं उन समस्याओं का आकार बढ़ा रहा हूं जिनकी मैं विश्लेषण कर रहा हूं और पायथन भयभीत रूप से धीमा है। पायथन कोड का धीमा हिस्साSWIG

for i in range(0,H,1): 
     x1 = i - length 
     x2 = i + length 
     for j in range(0,W,1): 
      #print i, ',', j # check the limits 
      y1 = j - length 
      y2 = j + length 
      IntRed[i,j] = np.mean(RawRed[x1:x2,y1:y2]) 

एच और डब्ल्यू के साथ 1024 के बराबर समारोह में उत्साह के लिए लगभग 5 मिनट लगते हैं। मैंने एक साधारण सी ++ प्रोग्राम/फ़ंक्शन लिखा है जो समान गणना करता है और यह उसी डेटा आकार के साथ एक सेकंड से भी कम समय में उत्साहित होता है।

double summ = 0; 
    double total_num = 0; 
    double tmp_num = 0 ; 
    int avesize = 2; 
    for(i = 0+avesize; i <X-avesize ;i++) 
    for(j = 0+avesize;j<Y-avesize;j++) 
     { 
     // loop through sub region of the matrix 
     // if the value is not zero add it to the sum 
     // and increment the counter. 
     for(int ii = -2; ii < 2; ii ++) 
      { 
      int iii = i + ii; 
      for(int jj = -2; jj < 2 ; jj ++) 
       { 
       int jjj = j + jj; 
       tmp_num = gsl_matrix_get(m,iii,jjj); 
       if(tmp_num != 0) 
        { 
        summ = summ + tmp_num; 
        total_num++; 
        } 


       } 
      } 
     gsl_matrix_set(Matrix_mean,i,j,summ/total_num); 
     summ = 0; 
     total_num = 0; 

     } 

मेरे पास 2 डी सरणी पर प्रदर्शन करने के लिए कुछ अन्य विधियां हैं। सूचीबद्ध एक सरल उदाहरण है।

मैं जो करना चाहता हूं वह मेरे सी ++ फ़ंक्शन में एक पायथन 2 डी सरणी पास करता है और 2 डी सरणी को वापस अजगर पर वापस कर देता है।

मैंने स्विग के बारे में कुछ पढ़ा है, और गंभीर प्रश्नों को तोड़ दिया है, और ऐसा लगता है कि यह एक संभावित समाधान है। लेकिन मुझे लगता है कि मुझे वास्तव में क्या करने की ज़रूरत नहीं है।

क्या मुझे कोई मदद मिल सकती है? धन्यवाद

+0

मैं शुरुआत करते हैं, पाइथन पहले। देखें: http://docs.python.org/extending/ – Santa

उत्तर

10

आप अरबी का उपयोग यहां वर्णित कर सकते हैं जैसा कि यहां वर्णित है: Doc - 5.4.5 Arrays, carray.i या std_vector.i SWIG लाइब्रेरी से। मुझे C++ SWIG एक्सटेंशन में एक पायथन सूची भेजने के लिए SWIG लाइब्रेरी std_vector.i से std :: वेक्टर के साथ काम करना आसान लगता है। यद्यपि आपके मामले में जहां अनुकूलन महत्वपूर्ण है, यह इष्टतम नहीं हो सकता है।

अपने मामले में आप को परिभाषित कर सकते हैं:

test.i

%module test 
%{ 
#include "test.h" 
%} 

%include "std_vector.i" 

namespace std { 
%template(Line) vector <int>; 
    %template(Array) vector < vector < int> >; 
} 

void print_array(std::vector< std::vector <int> > myarray); 

test.h

#ifndef TEST_H__ 
#define TEST_H__ 

#include <stdio.h> 
#include <vector> 

void print_array(std::vector< std::vector <int> > myarray); 

#endif /* TEST_H__ */ 

test.cpp

#include "test.h" 

void print_array(std::vector< std::vector <int> > myarray) 
{ 
    for (int i=0; i<2; i++) 
     for (int j=0; j<2; j++) 
      printf("[%d][%d] = [%d]\n", i, j, myarray[i][j]); 
} 

आप निम्नलिखित अजगर कोड (मैं अजगर 2.6.5 प्रयुक्त) चलाते हैं, तो आप देख सकते हैं सी ++ समारोह अजगर सूची तक पहुँच सकते हैं: विस्तार की मूल बातें कवर द्वारा

>>> import test 
>>> a = test.Array() 
>>> a = [[0, 1], [2, 3]] 
>>> test.print_array(a) 
[0][0] = [0] 
[0][1] = [1] 
[1][0] = [2] 
[1][1] = [3] 
+0

धन्यवाद, जो मैंने कोड किया है और यह बहुत अच्छा काम करता है। – JMD