On Github switowski / europython2016
It was nice to learn Python; a nice afternoon
Donald Knuth
Would you like your FIRST program EVER to be like:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } }
or
print("Hello, world!")
sum = 0 for x in range(1, N + 1): sum += x print sum
↓
print N * (1 + N) / 2
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live
John Woods
Python 3.5.1 (IPython 1.2.1)
def ultimate_answer_to_life(): return 42
>>> %timeit ultimate_answer_to_life() 10000000 loops, best of 3: 87.1 ns per loop
2.72 × 1021 times faster than in The Hitchhiker's Guide to the Galaxy ;-)
how_many = 0 for element in ONE_MILLION_ELEMENTS: how_many += 1 print how_many
26.5 ms
print len(ONE_MILLION_ELEMENTS)
96.7 ns
274 000 times faster
output = [] for element in MILLION_NUMBERS: if element % 2: output.append(element)
222 ms
list(filter(lambda x: x % 2, MILLION_NUMBERS))
234 ms
[item for item in MILLION_NUMBERS if item % 2]
127 ms 75% faster
class Foo(object): hello = 'world' foo = Foo()
if hasattr(foo, 'hello'): foo.hello
149 ns
try: foo.hello except AttributeError: pass
43.1 ns 3.5 times faster
if (hasattr(foo, 'foo') and hasattr(foo, 'bar') and hasattr(foo, 'baz')): foo.foo foo.bar foo.baz
401 ns
try: foo.foo foo.bar foo.baz except AttributeError: pass
110 ns 3.64 times faster
class Bar(object): pass bar = Bar()
if hasattr(bar, 'hello'): bar.hello
428 ns
try: bar.hello except AttributeError: pass
536 ns 25% slower
def check_number(number): for item in MILLION_NUMBERS: if item == number: return True return False
%timeit check_number(500000)
18 ms
500000 in MILLION_NUMBERS
8.45 ms 2 times faster
100 in MILLION_NUMBERS
1.55 µs
999999 in MILLION_NUMBERS
15.7 ms
MILLION_SET = set(MILLION_NUMBERS) %timeit 100 in MILLION_SET
46.3 ns 33 times faster (vs list)
%timeit 999999 in MILLION_SET
63.3 ns 248 000 times faster (vs list)
%timeit set(MILLION_NUMBERS)
106 ms
unique = [] for element in MILLION_ELEMENTS: if element not in unique: unique.append(element)
8.29 s
set(MILLION_ELEMENTS)
19.3 ms 400 times faster
Trick with OrderedDict (if order matters)
sorted(MILLION_RANDOM_NUMBERS)
467 ms
MILLION_RANDOM_NUMBERS.sort()
77.6 ms 6 times faster
def square(number): return number**2 squares = [square(i) for i in range(1000)]
399 µs
def compute_squares(): return [i**2 for i in range(1000)]
314 µs 27% faster
if variable == True:
35.8 ns
if variable is True:
28.7 ns 24% faster
if variable:
20.6 ns 73% faster
if variable == False:
35.1 ns
if variable is False:
26.9 ns 30% faster
if not variable:
19.8 ns 77% faster
if len(a_list) == 0:
91.7 ns
if a_list == []:
56.3 ns 60% faster
if not a_list:
32.4 ns 280% faster
def greet(name): return 'Hello {}!'.format(name)
329 ns
greet = lambda name: 'Hello {}!'.format(name)
332 ns
>>> dis.dis(greet) 0 LOAD_CONST 1 ('Hello {}!') 3 LOAD_ATTR 0 (format) 6 LOAD_FAST 0 (name) 9 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 12 RETURN_VALUEStack Overflow question on when lambda might be necessary
list()
104 ns
[]
22.5 ns
4.6 times faster
dict()
161 ns
{}
93 ns
1.7 times faster
q=1 w=2 e=3 r=4 t=5 y=6 u=7 i=8 o=9 p=0
71.8 ns
q,w,e,r,t,y,u,i,o,p = 1,2,3,4,5,6,7,8,9,0
56.4 ns 27% faster (but please don't)
def squares(MILLION_NUMBERS): output = [] for element in MILLION_NUMBERS: output.append(element*element) return output
149 ms
def squares_faster(MILLION_NUMBERS): output = [] append = output.append # <= !!!!!!!! for element in MILLION_NUMBERS: append(element*element) return output
110 ms 35% faster (and 27% more confusing)