For most travellers, there's really only one logical way - the bus. The airport is 50km away in Juliaca, and generally you fly from Lima.
I did this trip by bus back in 2010 - the 'fast' option around the lake, and you can read my brief bit about it on my blog.
From the Article on Wikivoyage:
Daily buses depart to and from La Paz, Bolivia on two slightly
Direct route via Desaguadero (the fastest route, about 5 hours taking shared taxis).
To do this, take a bus from the terminal or a shared taxi to
Desaguadero (2-3 hours, most buses leave before 10am) and after
getting your passport stamped on both sides of the bridge, you can
take a bus/minivan/shared taxi to La Paz (10/15/25 Bolivianos, 2-3
hours, much faster and more comfortable by shared taxi). If you want
more space in the back you can pay for an extra seat. Border
formalities are quite quick, but you might want to take a bicycle taxi
to avoid walking a long way from the bridge to the transport on either
side. You can change money here at one of the stalls outside Peruvian
immigration - it's best if you know the exchange rate in advance.
Via ferry boat across Lake Titicaca and Copacabana.
You should change some money at the border in order to be able to pay
the ferry in Bolivianos. Be prepared to change buses in Copacabana.
This will mean you will lose your good seats.
When the overnight bus to Cusco stops at the state line for the police
to inspect cargo underneath the bus, get out and watch your luggage to
avoid theft. Ormeños has buses leaving Puno between 8am and 9am every
day. The departure time depends on how long the bus takes to arrive
from Lima, so it is necessary to call Ormeños in Puno or Arequipa at
about 7am to find out what time the bus will be passing through. The
price is 100 Soles per person and the journey should take about 6