2012-05-18 20 views
7

benim programı hızlandırmak için aşağıdaki piton işlevini değiştirmek için bir C++ uzantısı yazmaya çalışıyorum kullanarakGeçiş piton liste boost piton

piton fonksiyonu aşağıdaki

def calc_dist(fea1, fea2): 
    #fea1 and fea2 are two lists with same length 
    ... 
benziyor

#include <vector> 
#include <boost/python.hpp> 
double calc_dist(vector<double>& fea1, vector<double>& fea2) 
{ 
    int len = fea1.size(); 
    double s=0; 
    for(int i=0; i<len;i++){ 
     double p=fea1[i]; 
     double q=fea2[i]; 
     ...//calculating.. 
    } 
    return s; 
} 
BOOST_PYTHON_MODULE(calc_dist) 
{ 
    using namespace boost::python; 
    def("calc_dist",calc_dist); 
} 

ve

gibi .bu dosyaya yukarıdaki cpp kodunu derlemek:

Ben şu gibi C++ ve boost python kullanırken fonksiyon yazdım

g++ calc_dist.cpp -shared -fPIC -o calc_dist.so -I /usr/include/python2.6 -lboost_python 

ve bir python programında .so kullanmaya çalıştığınızda, içe aktarma düzgün çalışır ve modülün başarıyla alınabileceğini gösterir.

ArgumentError: Python argument types in 
    calc_dist.calc_dist(list, list) 
did not match C++ signature: 
    calc_dist.calc_dist(std::vector<float, std::allocator<float> >, 
         std::vector<float, std::allocator<float> >) 

gibi

Ben işlevine parametreye iki listeyi geçmesi zaman Ancak, piton verecek hatalar herhangi biri bu sorunu çözmek için bana nasıl yardımcı olabilir? Ben destek kullanarak C++ uzantısı için bir python listesi geçmek?

Çok teşekkürler!

+1

Kullanım boost :: piton :: listesi bu soru [bkz ... başlangıç ​​için yeterince yakın olduğu ] (http://stackoverflow.com/questions/3761391/boostpython-python-list-to-stdvector) –

cevap

8

Bir Python listesinde çalışmasını istiyorsanız, neden std::vector kabul eden bir işlev yazdınız? Onlar farklı şeyler.

Boost.Python, python listelerini list sınıfı olarak gösterir.

Yani, işlevi test edilmemiş

double calc_dist(boost::python::list fea1, boost::python::list fea2) 
{ 
    boost::python::ssize_t len = boost::python::len(fea1); 
    double s=0; 
    for(int i=0; i<len;i++){ 
     double p = boost::python::extract<double>(fea1[i]); 
     double q = boost::python::extract<double>(fea2[i]); 
     ...//calculating.. 
    } 
    return s; 
} 

gibi görünmelidir, ama umarım

+0

Teşekkürler, boost python – user1403197

+0

hakkında daha fazla bilgi edinmeliyim, sadece örneği çevrimiçi dokümanlardan bir araya getirdim, yani ilerlemeniz için yeterli bilgi edinin. – Useless

+0

biri, bir python listesinden bir std :: vektörüne otomatik bir dönüşüm için ümit vericidir (şüphesiz). Bu kod, başlamak için yeterlidir, çünkü doğru bir C++ argümanı türü ve gerekli özü içerir. Teşekkürler! – ofloveandhate