[Edu-sig] Using try / except: any stipulations against routine use?
Andre Roberge
andre.roberge at gmail.com
Thu Dec 15 01:59:58 CET 2011
On Wed, Dec 14, 2011 at 6:15 PM, Bert Freudenberg <bert at freudenbergs.de>wrote:
> On 14.12.2011, at 22:42, Vernon Cole wrote:
>
> > Sorry, Kirby, I'm afraid I disagree.
> > try:
> > res_dict[ext] += 1
> > except KeyError:
> > res_dict[ext] = 1
> > is clear in intent and operation. It is a self-initializing occurrence
> counter.
> >
> > On the other hand,
> > res_dict[ext] = res_dict.get(ext, 0) + 1
> > is obscure.
>
SNIP
> Isn't this at least as readable, and conceptually simpler?
>
> if ext in res_dict:
> res_dict[ext] += 1
> else:
> res_dict[ext] = 1
>
> Not arguing against exceptions in general, but in this case?
>
>
Personally, I find both the if/else and the try/except much easier to
remember, and slightly easier to read than the one-liner.
Furthermore, if one is interested in performance, it appears that the
if/else approach is *always* faster than the one-liner. When exceptions
are rarely raised, then the try/except approach is the fastest. Below are
the results from a quick test to compare the efficiency of the three cases,
followed by the code. This is using Python 2.7 on a fairly old computer.
André
===============================
100% new keys
setdefault: 0.532404899597
try/except: 2.029556036
if/else: 0.241212844849
--------------------------------------------------
10% new keys
setdefault: 0.621008872986
try/except: 0.585212945938
if/else: 0.32776093483
--------------------------------------------------
1% new keys
setdefault: 0.615134000778
try/except: 0.388912916183
if/else: 0.321834087372
--------------------------------------------------
0.1% new keys
setdefault: 0.527935028076
try/except: 0.28360915184
if/else: 0.334416866302
================
from timeit import Timer
print "100% new keys\n"
print 'setdefault:\t',
t = Timer("""
d = {}
for i in range(1000):
d[i] = d.get(i, 0) + 1
""")
print t.timeit(number=1000)
print 'try/except:\t',
t = Timer("""
d = {}
for i in range(1000):
try:
d[i] += 1
except KeyError:
d[i] = 1
""")
print t.timeit(number=1000)
print 'if/else:\t',
t = Timer("""
d = {}
for i in range(1000):
if i in d:
d[i] += 1
else:
d[i] = 1
""")
print t.timeit(number=1000)
print "-"*50
print "10% new keys"
print 'setdefault:\t',
t = Timer("""
d = {}
for i in range(1000):
k = i % 100
d[k] = d.get(k, 0) + 1
""")
print t.timeit(number=1000)
print 'try/except:\t',
t = Timer("""
d = {}
for i in range(1000):
k = i % 100
try:
d[k] += 1
except KeyError:
d[k] = 1
""")
print t.timeit(number=1000)
print 'if/else:\t',
t = Timer("""
d = {}
for i in range(1000):
k = i % 100
if i in d:
d[k] += 1
else:
d[k] = 1
""")
print t.timeit(number=1000)
print "-"*50
print "1% new keys\n"
print 'setdefault:\t',
t = Timer("""
d = {}
for i in range(1000):
k = i % 10
d[k] = d.get(k, 0) + 1
""")
print t.timeit(number=1000)
print 'try/except:\t',
t = Timer("""
d = {}
for i in range(1000):
k = i % 10
try:
d[k] += 1
except KeyError:
d[k] = 1
""")
print t.timeit(number=1000)
print 'if/else:\t',
t = Timer("""
d = {}
for i in range(1000):
k = i % 10
if i in d:
d[k] += 1
else:
d[k] = 1
""")
print t.timeit(number=1000)
print "-"*50
print "0.1% new keys\n"
print 'setdefault:\t',
t = Timer("""
d = {}
for i in range(1000):
d[1] = d.get(1, 0) + 1
""")
print t.timeit(number=1000)
print 'try/except:\t',
t = Timer("""
d = {}
for i in range(1000):
try:
d[1] += 1
except KeyError:
d[1] = 1
""")
print t.timeit(number=1000)
print 'if/else:\t',
t = Timer("""
d = {}
for i in range(1000):
if 1 in d:
d[1] += 1
else:
d[1] = 1
""")
print t.timeit(number=1000)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20111214/76464338/attachment.html>
More information about the Edu-sig
mailing list