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.