The PRT Source makes a copy of the stream’s particle data, so it knows exactly how many particles there are. The cost of this is that all those particles are stored in memory at least twice (once by the source, then again by the renderer).
The viewport display shows how many particles it is drawing, but unfortunately this has very little correlation with the number of particles present at render time (the spacing / percentage is definitely different). In the case of the PRT Volume, figuring out how many particles will fit inside your mesh can only be determined by actually creating all the particles (ie. exactly the same work as requesting each particle until it stops generating them like Bobo mentioned).
If you are happy with the memory cost, why not just stick with using the PRT Source approach? Anything I add to deal with this case will be no less expensive.