minor optimizations
read takes a list