2010-10-15 46 views
8

tôi có một loạt các lớp học và các API viết bằng C++ và tiếp xúc với Python với sự giúp đỡ của Boost.PythonPython C++ chức năng chuyển đổi sử dụng Boost.Python

Tôi hiện đang điều tra khả năng của việc tạo ra các kiến ​​trúc sau.
Trong python:

from boostPythonModule import * 
AddFunction(boostPythonObject.Method1, args) 
AddFunction(boostPythonObject.Method2, args) 
AddFunction(boostPythonObject.Method2, args) 
RunAll() # running is done by C++ 

Trong C++:

void AddFunction(boost::object method, boost::object args) 
{ 
    /// 1. Here i need to extract a real pointer to a function 
    /// 2. Make argument and type checking for a function under method 
    /// 3. Unpack all arguments to native types 
    /// 4. Store the pointer to a function somewhere in local storage 
} 

void RunAll() 
{ 
    /// 1. run all previously stored functions and arguments for them 
} 

Về cơ bản tôi đang cố gắng để đưa tất cả các chức năng xuống đến phần nguồn gốc của chương trình của tôi. Vấn đề là tôi không chắc liệu có thể trích xuất tất cả các dữ liệu cần thiết từ Boost metainfo để làm điều này theo cách chung - lúc biên dịch tôi không biết tôi sẽ gọi hàm nào và đối số nào họ chấp nhận.

Một số câu hỏi:
1. Có bảng thông tin Python được chia sẻ nào tôi có thể truy cập để kiểm tra một số nội dung này không?
2. Boost.Python thực hiện kiểm tra đối số. Nó có thể được tái sử dụng một cách riêng biệt?

Hãy cho tôi biết suy nghĩ của bạn.

Cảm ơn

+0

Bạn có thực sự cần phải kiểm tra tất cả các loại trong 'AddFunction()'? Nó sẽ không đủ để lưu trữ phương thức và đối số ở đâu đó và gọi những phương thức đó trong 'RunAll()' Bằng cách đó bạn sẽ nhận được bất kỳ lỗi liên quan đến kiểu nào mà bạn gặp phải khi bạn thực hiện các phương thức và Boost.Python sẽ làm điều đó cho bạn . – Arlaharen

+0

Ồ, không. Về cơ bản ý tưởng là để giảm thiểu khoảng cách thời gian giữa các cuộc gọi chức năng đó, do đó tất cả các đối số phải được kiểm tra trước đó. RuAll chỉ nên biết về các con trỏ hàm C++ (ví dụ: functors), Bất kỳ lời khuyên nào khác? – Alex

+1

Trong trường hợp đó tôi không có. :-) Tôi không nghĩ rằng đây là một trường hợp sử dụng mà Boost.Python được thiết kế cho và bạn sẽ có một thời gian khó khăn để uốn cong nó để làm những gì bạn muốn. Là thời gian dành cho Python giữa các cuộc gọi đến các phương pháp của bạn thực sự rất quan trọng mà bạn phải làm điều này? Nhưng tôi đoán bạn đã thực hiện profiling của bạn ... :-) – Arlaharen

Trả lời

1

Tôi sẽ suy nghĩ về chức năng bộ nhớ đệm và lập luận của họ trên mức python - lưu các đối số sử dụng biểu mẫu mới nhất từ ​​Keyword arguments phần của hướng dẫn và gọi C chức năng của mình ++ sau unpacking saved arguments giải nén thực hiện ở mức python sẽ cô lập bạn từ bất kỳ biến chứng an toàn biến thể nào (tất cả việc đánh máy sẽ được thực hiện trên giai đoạn RunAll làm cho nó chậm hơn và kém an toàn hơn).

Phương pháp tối ưu hóa tốc độ sẽ là triển khai một C++ clasess với giao diện chung có thể chấp nhận một cuộc gọi hàm hỗ trợ các đối số đã cho và lưu vào bộ nhớ đệm các giá trị bên trong để sử dụng trong lần chạy sau.

struct Runner { 
    virtual int run() = 0; 
}; 

struct ConcreteRunner: public Runner { 
    std::string _arg; 
    void setArguments(std::string arg) {_arg=arg;} 
    virtual int run() {clog << "ConcreteRunner is called with argument" << _arg << endl;} 
}; 

Phương pháp này xử lý phân tích đối số bên ngoài phần RunAll do đó, làm cho nó càng nhanh càng tốt.

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