Puno does not have an airport. But you can reach the nearest city Juliaca by Plane. Aeropuerto Manco Capac Airport in Juliaca is only at 45 km distance from Puno. You can reach Juliaca from Lima, Cusco and Arequipa. Lima to Juliaca flight takes around two and a half hour. It has a stoppage either in Cusco or in Arequipa. There are several flights available, Lan Peru, Aero Condor and Star Peru fly in this route. Arequipa to Juliaca is a direct flight and takes around 40-50 minutes. There are several flights available, Lan Peru, Aero Condor and Star Peru fly in this route. Currently only Lan Peru has flights between Cusco and Juliaca. Flight time is only around 50 minutes.
You can reach Puno by bus from Cusco and Arequipa. Lima is too far to move by Bus. From Cusco you need 6/7 hours to reach Puno. Journey is comfortable. From Arequipa to Puno is only 5 hours. Few years back it took usually 12 hours to reach Puno from Arequipa. But they have constructed a new road, so now you can have a comfortable journey from Arequipa to Puno. Here you can choose between two types of Bus. One is regular service and the other one is Imperial or Royal bus service. Ohh.. I forgot there is another one. This one is called Tourist Bus ( I will talk about it later). Regular service is cheap, like 6-10 $. But service is not very good. They do not have any toilet inside and seats are not comfortable. Adding only few dollars you can enjoy the Imperial service. Imperial service is 15 to 25 $. But they are really good. Seats are really comfortable. English speaking guide, video, sandwich and a lot more are provided in imperial or royal service. I will strongly recommend imperial service. If you have time you can choose tourist bus also. The difference is that, they stop at some ruins and spend some time there. The fair for tourist bus is around 35/40 $.
Now which bus companies you would choose! Different Bus companies are there. Cruze del Sur, Ormeno and Imexso are big companies. There are other bus companies also. For imperial service you can choose Cruz Del Sur or Ormeno, both of them are good.
Website of Bus Companies
Only in Spanish language
You can not buy ticket in Online, but can contact them easily
Cruz Del Sur
You can buy ticket online
You can reach Puno from Cusco by train. Though it takes at least 10 hours ( usually it is late), this is the best train journey in Peru. It passes through at an altitude of 11500 ft. Places it passes is considered to be most scenic in Peru. Trains depart from Huanchaq station at Cusco. They depart at 8 am and suppose to reach at 6 pm at Puno. They have two types of service for Puno. Andean Explorer is expensive ( $ 120.00), but very very comfortable and meals are provided during journey. You can go by Backpacker class, which is really cheap, only 17.00$. Backpackers service is also comfortable, though no food is offered.
There is no regular train service from Arequipa to Puno. But if you are in a group, you can charter a train.