2012-05-18 37 views
7

Tôi đang cố gắng để viết một C++ mở rộng để thay thế chức năng python sau đây để tăng tốc độ chương trình của tôiđèo python danh sách để C++ mở rộng việc sử dụng tăng python

Chức năng python trông giống như sau

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

tôi đã viết các chức năng sử dụng C++ và tăng python như sau:

#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); 
} 

và biên dịch mã cpp trên vào một file .so như

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

và cố gắng sử dụng .so trong chương trình python, quá trình nhập hoạt động tốt, cho biết mô-đun có thể nhập thành công.

Tuy nhiên, bất cứ khi nào tôi vượt qua hai danh sách để các tham số cho hàm, trăn sẽ cung cấp cho các lỗi như

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> >) 

có thể bất kỳ một giúp tôi làm thế nào để giải quyết vấn đề này? tức là vượt qua một danh sách python để C++ mở rộng bằng cách sử dụng tăng?

Cảm ơn rất nhiều!

+1

Sử dụng boost :: python :: danh sách xem [câu hỏi này ] (http://stackoverflow.com/questions/3761391/boostpython-python-list-to-stdvector) –

Trả lời

8

Tại sao bạn viết hàm chấp nhận std::vector nếu bạn muốn nó hoạt động trên danh sách Python? Họ là những thứ khác nhau.

Boost.Python hiển thị danh sách trăn là lớp list.

Vì vậy, chức năng của bạn sẽ giống như

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; 
} 

nó chưa được thử nghiệm, nhưng hy vọng là đủ gần để giúp bạn bắt đầu ...

+0

Cảm ơn, có vẻ như tôi nên tìm hiểu thêm về tăng python – user1403197

+0

Tôi chỉ cần đặt ví dụ với nhau từ các tài liệu trực tuyến, do đó, nên là đủ thông tin để bạn có thể tiến bộ. – Useless

+0

một sẽ (có lẽ ngây thơ) hy vọng cho một chuyển đổi tự động từ một danh sách python đến một std :: vector, không có nghi ngờ. mã này là quá đủ để bắt đầu, vì nó bao gồm một loại đối số C++ chính xác và trích xuất cần thiết. cảm ơn! – ofloveandhate

Các vấn đề liên quan