How would it be able to calculate results from an arbitrary vector of preferences in realtime? It seems like the sort of thing that could not be done quickly enough to respond with a synchronous API request. In other words, it seems like the sort of thing that is naturally backgrounded.
It can be done fast enough. There is some pre-processing of the raw data at startup time, so all we store in memory is a matrix representation of our user/artist preference graph.
A typical preference calculation for a new arbitrary set of artists takes 50-100ms, at which point it is cached for a while. Our most common queries [individual performers, for example] tend to read from cache, which helps.