> When you discovered the above, how much information did you get about the calling unit? (indeed, which tool did you use? I need to learn how to do this...)

I use Shark on my Mac.  However, I think this was superseded by some other program on Lion.  I forget the name of what they switched to.  It's hard to diagnose python-layer commands, since everything comes back as PyEval or PyCall or similar.  But for things in the C++ layer, it tells you how much time each function takes, and you can even see which line within the function is a hot spot.

The bulk (>50%) of the remaining bottleneck in the cf branch is the ifft2 call in cf.applyNoiseTo.  (Shark told me that ffts were the bulk of the time, and then I tested by commenting out each python fft call in turn to see how much time it saved.  This one was the biggest time sink.)