With Swig now supporting std::array I can finally dispose of any polling and python is now called with a callback interface whenever a sample has arrived. So even less computing time wasted.
This is all hidden away in the swig wrapper. The user just receives the samples via the callback at the given sampling rate and won't need to worry about anything else.