Great thanks! The method slove our problems. On Wed, May 13, 2015 at 3:58 PM, Amaury Forgeot d'Arc <amaur...@gmail.com> wrote:
> Hi, > > 2015-05-13 4:42 GMT+02:00 Yicong Huang <hengha....@gmail.com>: > >> However, the code is quite slow for reasons: >> 1. Pypy treats the same function call for a new function every time. It >> took time to do parsing, analysing and such a lot of work. >> 2. JIT could not give any benifits for the single function call. >> > > As said in the docs, the trick is to call pypy_execute_source once, and > make it return a set of C function pointers. > > Here is how I would do it: > > - in a file "interface.py" > > import cffi > > ffi = cffi.FFI() > ffi.cdef(''' > struct API { > double (*add_numbers)(double x, double y); > }; > ''') > > # Better define callbacks at module scope, it's important to keep this > object alive. > @ffi.callback("double (double, double)") > def add_numbers(x, y): > return x + y > > def fill_api(ptr): > api = ffi.cast("struct API*", ptr) > api.add_numbers = add_numbers > > > - From C code: > > struct API { > double (*add_numbers)(double x, double y); > }; > > API api; > const char source[] = "import interface; > interface.fill_api(c_argument)"; > res = pypy_execute_source_ptr(source, &api); > > // Now call this in a loop: > api.add_numbers(12, 13); > > > -- > Amaury Forgeot d'Arc >
_______________________________________________ pypy-dev mailing list pypy-dev@python.org https://mail.python.org/mailman/listinfo/pypy-dev