Fredrik Lundh wrote:
Jeremy Jones wrote:

  
#################################
file_dict = {}

a_list = [("a", "a%s" % i) for i in range(2500)]
b_list = [("b", "b%s" % i) for i in range(2500)]
c_list = [("c", "c%s" % i) for i in range(2500)]
d_list = [("d", "d%s" % i) for i in range(2500)]


joined_list = a_list + b_list + c_list + d_list

for key, value in joined_list:
   outfile = file_dict.setdefault(key, open("%s.txt" % key, "w"))
    

you do realize that this opens the file again every time, so you end up having
4x2500 file handles pointing to 4 physical files.  that's a bad idea.
  
That *is* a bad idea, and no, I didn't realize that would be the result.  From the "mapping types" page:

a.setdefault(k[, x]) a[k] if k in a, else x (also setting it) (5)

(5)
setdefault() is like get(), except that if k is missing, x is both returned and inserted into the dictionary as the value of k. x defaults to None.

I took this to mean that setdefault was a short-circuit and only created the default object once if the dictionary didn't contain the specified key.  But I guess it's *me* who is passing setdefault a new file handle a few thousand times :-)  Ouch.
if you replace

    outfile = file_dict.setdefault(key, open("%s.txt" % key, "w"))

with

    outfile = file_dict.get(key)
    if outfile is None:
        file_dict[key] = outfile = open("%s.txt" % key, "w")

or, if you prefer,

    try:
        outfile = file_dict[key]
    except KeyError:
        file_dict[key] = outfile = open("%s.txt" % key, "w")

your code won't depend on any undefined behaviour, and will work properly
on all platforms.

</F> 



  
Thanks (and thanks to you, Duncan, for your reply as well),


Jeremy
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to