Tim Peters
Donald Knuth
li = [1, 2, 3, 4]
print(li)
[1, 2, 3, 4]
import sys
li = list(range(20))
print(sys.getsizeof(li))
288
li.append(1)
print(sys.getsizeof(li))
288
small_list = [x for x in range(3)]
large_list = [x for x in range(5000000)]
%timeit -qo small_list[2]
<TimeitResult : 10000000 loops, best of 3: 55.5 ns per loop>
%timeit -qo large_list[400000]
<TimeitResult : 10000000 loops, best of 3: 57.1 ns per loop>
def pop_all_from_left_to_right(li):
while li:
val = li.pop(0)
# do something with val
%timeit -qo pop_all_from_left_to_right(list(range(100000)))
<TimeitResult : 1 loop, best of 3: 3.21 s per loop>
def pop_all_from_left_to_right_better(li):
rev_li = list(reversed(li))
while rev_li:
val = rev_li.pop()
# do something with val
return reversed(rev_li)
%timeit pop_all_from_left_to_right_better(list(range(100000)))
10 loops, best of 3: 16.1 ms per loop
a_tuple = (1, 2, 3)
print(a_tuple)
(1, 2, 3)
a_tuple[1] = 1
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-13-c9b81d58aa32> in <module>() ----> 1 a_tuple[1] = 1 TypeError: 'tuple' object does not support item assignment
sys.getsizeof(tuple(range(5)))
88
sys.getsizeof(tuple(range(6)))
96
a_set = {1, 5, 3, 'foo'}
print(a_set)
{3, 1, 'foo', 5}
a_set.add([1,2])
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-4f58d274d540> in <module>() ----> 1 a_set.add([1,2]) TypeError: unhashable type: 'list'
a_set.add(tuple([1, 2]))
a_set
{3, 1, 'foo', 5, (1, 2)}
set | list | |
---|---|---|
len | O(1) | O(1) |
append/add | O(1) | O(1) |
in/not in | O(1) | O(N) |
remove | O(1) | O(N) |
pop | O(1) | O(N) |
import random
a_small_list = [random.randint(0, 500) for _ in range(500)]
a_large_list = [random.randint(0, 500) for _ in range(500000)]
def without_dupes(a_list):
seen = set()
items = []
for elem in a_list:
if elem not in seen:
seen.add(elem)
items.append(elem)
return items
%timeit without_dupes(a_small_list)
%timeit without_dupes(a_large_list)
10000 loops, best of 3: 157 µs per loop 10 loops, best of 3: 112 ms per loop
a_dict = {'a': 1, 'd': 3, 'c':2}
print(a_dict)
{'a': 1, 'c': 2, 'd': 3}
a_dict[[1,2]] = 3
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-22-b9249f86eb14> in <module>() ----> 1 a_dict[[1,2]] = 3 TypeError: unhashable type: 'list'
a_dict[(1,2)] = 3
a_dict[frozenset([3, 4, 5])] = 'foo'
print(a_dict)
{(1, 2): 3, 'a': 1, 'c': 2, frozenset({3, 4, 5}): 'foo', 'd': 3}
from collections import Counter
c = Counter(['a', 'b', 'c', 'd', 'a', 'd', 'b'])
print(c)
Counter({'b': 2, 'a': 2, 'd': 2, 'c': 1})
c['a'] += 1
print(c)
Counter({'a': 3, 'b': 2, 'd': 2, 'c': 1})
print(c['e'])
0
print(c.most_common(3))
[('a', 3), ('b', 2), ('d', 2)]
c.update(['a', 'b', 'b', 'd'])
print(c)
Counter({'b': 4, 'a': 4, 'd': 3, 'c': 1})
from collections import deque
d = deque([1,2,3])
print(d)
deque([1, 2, 3])
d.append(4)
print(d)
deque([1, 2, 3, 4])
d.appendleft(5)
print(d)
deque([5, 1, 2, 3, 4])
print(d.pop(), d.popleft())
print(d)
4 5 deque([1, 2, 3])
d = deque([1,2,3], maxlen=3)
print(d)
deque([1, 2, 3], maxlen=3)
d.append(4)
print(d)
deque([2, 3, 4], maxlen=3)
d = deque(range(50000))
def loop_with_for(deq):
for elem in deq:
elem
def loop_with_index(deq):
for i in range(len(deq)):
deq[i]
%timeit loop_with_for(d)
%timeit loop_with_index(d)
1000 loops, best of 3: 1.66 ms per loop 10 loops, best of 3: 29.4 ms per loop
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(2, 3)
print(p)
print(p.x, p.y)
Point(x=2, y=3) 2 3
Point(*(2,3))
Point(x=2, y=3)
print(p[0:1])
(2,)
from collections import OrderedDict
ord_dict = OrderedDict()
ord_dict['c'] = 3
ord_dict['a'] = 1
print(ord_dict)
OrderedDict([('c', 3), ('a', 1)])
ord_dict = OrderedDict({'b': 1, 'a': 2})
print(ord_dict)
OrderedDict([('b', 1), ('a', 2)])
ord_dict = OrderedDict([('b', 1), ('a', 2)])
print(ord_dict)
OrderedDict([('b', 1), ('a', 2)])
Boltons: https://boltons.readthedocs.org/
class Dicto(dict):
def __getitem__(self, k):
return 31
d = Dicto()
print(d[2])
31
print(d.get(2))
None
from collections.abc import MutableMapping
class CaseInsensitiveDict(MutableMapping):
def __init__(self):
self.d = {}
def __delitem__(self, i):
del self.d[i]
def __setitem__(self, k, v):
self.d[k.lower()] = v
def __getitem__(self, k):
return self.d[k.lower()]
def __iter__(self):
return iter(self.d)
def __len__(self):
return len(self.d)
d = CaseInsensitiveDict()
d['eggs'] = 'ovos'
d['ham'] = 'presunto'
for i in d:
print(i + ': ' + d[i])
eggs: ovos ham: presunto
d.get('HaM')
'presunto'
x_list = [float(x) for x in range(100000)]
sys.getsizeof(x_list) + len(x_list) * sys.getsizeof(float())
3224464
import array
x_array = array.array('d', [float(x) for x in range(100000)])
sys.getsizeof(x_array)
800064
%timeit sum(x_list)
1000 loops, best of 3: 747 µs per loop
%timeit sum(x_array)
100 loops, best of 3: 4.06 ms per loop
import numpy
x_narray = numpy.array([float(x) for x in range(100000)])
%timeit -qo numpy.sum(x_narray)
<TimeitResult : 10000 loops, best of 3: 61.3 µs per loop>
Slides: http://bit.ly/pybr12-vinta