Basically, considering everything taken into account, (data stored during compile-time, data stored during runtime, data stored in savefiles, CPU used, etc.), which is better in a given situation.
Of course, there are some situations when one is always better than the other, let's try and forget (however impossible that may be) about those situations, and contradict ourselves with this question.
Let's use this example that comes to mind:
//Storing every single turf in the world:
var/turfs[world.maxx][world.maxy][world.maxz]
for(var/turf/T in world)
turfs[T.x][T.y][T.z]=T
//OR
var/list/turfs=list()
for(var/turf/T in world)
turfs["[T.x],[T.y],[T.z]"]=T
//Of course, with both conditions starting with a savefile being created,
//and ending with this:
F["turfs"]<<turfs
If you are doing this for saving purposes, directly dumping every turf in the world is a very inefficient means of saving. I would suggest using DMP/DMM saving (for considerable hard drive space savings at the cost of efficiency) or writing each map file as a custom symbol table -- instead of writing each turf, write each Z-level data as a carriage-return delimited sequence of characters into a savefile, with directories handled by :
...et cetera.
If you are not doing this for saving purposes, why do you need to store a list of the turfs at all when you can simply get any turf any time you like with the locate(x,y,z) proc?