C-extension 2 times slower than exe
Rolf Wester
rolf.wester at ilt.fraunhofer.de
Wed Jun 24 10:10:35 EDT 2009
Hello,
thank you all very much for your replies.
I tried to simplify things and make the two versions as comparable as
possible. I put the C++ part of the program into a shared object
libff.so. For the exe the main function is linked against this shared
object. For the python stuff I made an interface consiting of only one
function call_solver with the same code that has the main function used
for the exe. Then I created a wrapper for this interface using swig and
linked interface.o, ff_warp.o and libff.so into _ff.so. The Python code
just imports _ff and calls call_solver wich creates an object of the
class Solver and calls its member solve (the main function of the exe
does the same).
I included some code for timing into the C++-code.
#include <time.h>
//beginning of solve
clock_t t0 = clock();
...
clock_t t1 = clock();
//end of solve
cout << "time used = " << (t1-t0)/CLOCKS_PER_SEC << endl;
I'm using gcc4.5 (latest snapshot) and Python2.6 under Suse 10.3. The
sources are compiled using the flags -fPIC -O3.
Timing:
1) time python ff.py
time used = 3.74
real 0m3.234s
user 0m3.712s
sys 0m0.192s
2) time ff
time used = 2.19
real 0m3.170s
user 0m2.088s
sys 0m0.168s
I tried some other optimizations:
-O0:
1)
time used = 21.91
real 0m21.568s
user 0m22.001s
sys 0m0.160s
2)
time used = 20.87
real 0m22.206s
user 0m20.989s
sys 0m0.148s
-O1
1)
time used = 4.04
real 0m3.660s
user 0m4.000s
sys 0m0.160s
2)
time used = 2.72
real 0m3.454s
user 0m2.648s
sys 0m0.164s
It seems that there is an overhead of about 2 secs within the C++-code.
I'm going to try this out with a problem that takes much more time than
the present one.
Regards
Rolf
Carl Banks wrote:
> On Jun 23, 7:20 am, Rolf Wester <rolf.wes... at ilt.fraunhofer.de> wrote:
>> Philip Semanchuk wrote:
>>
>>> On Jun 23, 2009, at 9:51 AM, Rolf Wester wrote:
>>>> Hi,
>>>> I have a C++ program that I would like to steer using Python. I made the
>>>> wrapper using swig and linked the code (without the main function) into
>>>> a shared object. My Python script loads the extension and calls a
>>>> function of the C-extension, the rest runs entirely within the
>>>> C-extension. For comparison I compiled the code including the main
>>>> function with the same compilation options and linked all into an exe.
>>>> The main function of the exe calls the same function as my Python script
>>>> does. Surprisingly the code in the Python C-extension runs twice as long
>>>> as the same code in the exe. Does anyone know what could be the reason
>>>> for this behaviour?
>>> If the runtime of the C/C++ code is short, the time spent initializing
>>> the Python interpreter might have a big impact on the runtime of the
>>> Python version.
>> The runtime is about 2.5 sec and 5.0 sec respectively. I not only use
>> the time command to measure the time consumed but I also measure the
>> time within the C-code using clock() and get similar result. So the
>> Python startup time is not the reason for the runtime difference I
>> found. Thank you anyway.
>
> We can't really help you much unless you give us more details about
> what you did (how did you built it, how did you time it, and how are
> you calling the C extension from Python). All we can do is throw out
> possible ideas, and I will toss out a few, but if that's not it you'll
> have to post details.
>
> Are you building the extension with the same optimization flags as the
> compiler?
>
> Are you calling the C code repeatedly from inside a Python loop?
>
More information about the Python-list
mailing list