This is really two questions, but they are so similar, and to keep it simple, I figured I\'d just roll them together:
Firstly: Given an est
Run your app through the Python profiler. Find a serious bottleneck. Rewrite that bottleneck in C. Repeat.
It's often possible to achieve near-C speeds (close enough for any project using Python in the first place!) by replacing explicit algorithms written out longhand in Python with an implicit algorithm using a built-in Python call. This works because most Python built-ins are written in C anyway. Well, in CPython of course ;-) https://www.python.org/doc/essays/list2str/
The canonical reference to how to improve Python code is here: PerformanceTips. I'd recommend against optimizing in C unless you really need to though. For most applications, you can get the performance you need by following the rules posted in that link.
I'm surprised no one mentioned ShedSkin: http://code.google.com/p/shedskin/, it automagically converts your python program to C++ and in some benchmarks yields better improvements than psyco in speed.
Plus anecdotal stories on the simplicity: http://pyinsci.blogspot.com/2006/12/trying-out-latest-release-of-shedskin.html
There are limitations though, please see: http://tinyurl.com/shedskin-limitations
Rather than just punting to C, I'd suggest:
Make your code count. Do more with fewer executions of lines:
numpy
out.Twisted
framework.If all of the above fails for profiled and measured code, then begin thinking about the C-rewrite path.
This is the procedure that I try to follow: