I have used the Python's C-API to call some Python code in my c code and now I want to profile my python code for bottlenecks. I came across the PyEval_SetProfile API and am not sure how to use it. Do I need to write my own profiling function?  
I will be very thankful if you can provide an example or point me to an example.
If you only need to know the amount of time spent in the Python code, and not (for example), where in the Python code the most time is spent, then the Python profiling tools are not what you want.  I would write some simple C code that sampled the time before and after the Python interpreter invocation, and use that.  Or, C-level profiling tools to measure the Python interpreter as a C function call.
If you need to profile within the Python code, I wouldn't recommend writing your own profile function.  All it does is provide you with raw data, you'd still have to aggregate and analyze it.  Instead, write a Python wrapper around your Python code that invokes the cProfile module to capture data that you can then examine.
Profiling Python via C-api (How to ? )