Skip to content

Commit 5e6cb1f

Browse files
committed
do setup only once
1 parent 188c12d commit 5e6cb1f

File tree

2 files changed

+25
-41
lines changed

2 files changed

+25
-41
lines changed

episodes/optimisation-data-structures-algorithms.md

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -238,41 +238,36 @@ If you reduce the value of `repeats` it will run faster, how does changing the n
238238
import random
239239
from timeit import timeit
240240

241-
def generateInputs(N = 25000):
242-
random.seed(12) # Ensure every list is the same
243-
return [random.randint(0,int(N/2)) for i in range(N)]
244-
241+
N = 25000 # Number of elements in the list
242+
random.seed(12) # Ensure every list is the same
243+
data = [random.randint(0, int(N/2)) for i in range(N)]
244+
245245
def uniqueSet():
246-
ls_in = generateInputs()
247-
set_out = set(ls_in)
246+
set_out = set(data)
248247

249248
def uniqueSetAdd():
250-
ls_in = generateInputs()
251249
set_out = set()
252-
for i in ls_in:
250+
for i in data:
253251
set_out.add(i)
254252

255253
def uniqueList():
256-
ls_in = generateInputs()
257254
ls_out = []
258-
for i in ls_in:
255+
for i in data:
259256
if not i in ls_out:
260257
ls_out.append(i)
261258

262259
def uniqueListSort():
263-
ls_in = generateInputs()
264-
ls_in.sort()
260+
ls_in = sorted(data)
265261
ls_out = [ls_in[0]]
266262
for i in ls_in:
267263
if ls_out[-1] != i:
268264
ls_out.append(i)
269-
265+
270266
repeats = 1000
271-
gen_time = timeit(generateInputs, number=repeats)
272-
print(f"uniqueSet: {timeit(uniqueSet, number=repeats)-gen_time:.2f}ms")
273-
print(f"uniqueSetAdd: {timeit(uniqueSetAdd, number=repeats)-gen_time:.2f}ms")
274-
print(f"uniqueList: {timeit(uniqueList, number=repeats)-gen_time:.2f}ms")
275-
print(f"uniqueListSort: {timeit(uniqueListSort, number=repeats)-gen_time:.2f}ms")
267+
print(f"uniqueSet: {timeit(uniqueSet, number=repeats):.2f}ms")
268+
print(f"uniqueSetAdd: {timeit(uniqueSetAdd, number=repeats):.2f}ms")
269+
print(f"uniqueList: {timeit(uniqueList, number=repeats):.2f}ms")
270+
print(f"uniqueListSort: {timeit(uniqueListSort, number=repeats):.2f}ms")
276271
```
277272

278273
:::::::::::::::::::::::: hint
@@ -325,41 +320,34 @@ from bisect import bisect_left
325320
N = 25000 # Number of elements in list
326321
M = 2 # N*M == Range over which the elements span
327322

328-
def generateInputs():
329-
random.seed(12) # Ensure every list is the same
330-
st = set([random.randint(0, int(N*M)) for i in range(N)])
331-
ls = list(st)
332-
ls.sort() # Sort required for binary
333-
return st, ls # Return both set and list
323+
random.seed(12) # Ensure every list is the same
324+
st = set([random.randint(0, int(N*M)) for i in range(N)])
325+
ls = list(st)
326+
ls.sort() # Sort required for binary search
334327

335328
def search_set():
336-
st, _ = generateInputs()
337329
j = 0
338330
for i in range(0, int(N*M), M):
339331
if i in st:
340332
j += 1
341333

342334
def linear_search_list():
343-
_, ls = generateInputs()
344335
j = 0
345336
for i in range(0, int(N*M), M):
346337
if i in ls:
347338
j += 1
348339

349340
def binary_search_list():
350-
_, ls = generateInputs()
351341
j = 0
352342
for i in range(0, int(N*M), M):
353343
k = bisect_left(ls, i)
354344
if k != len(ls) and ls[k] == i:
355345
j += 1
356346

357-
358347
repeats = 1000
359-
gen_time = timeit(generateInputs, number=repeats)
360-
print(f"search_set: {timeit(search_set, number=repeats)-gen_time:.2f}ms")
361-
print(f"linear_search_list: {timeit(linear_search_list, number=repeats)-gen_time:.2f}ms")
362-
print(f"binary_search_list: {timeit(binary_search_list, number=repeats)-gen_time:.2f}ms")
348+
print(f"search_set: {timeit(search_set, number=repeats):.2f}ms")
349+
print(f"linear_search_list: {timeit(linear_search_list, number=repeats):.2f}ms")
350+
print(f"binary_search_list: {timeit(binary_search_list, number=repeats):.2f}ms")
363351
```
364352

365353
Searching the set is fastest performing 25,000 searches in 0.04ms.

episodes/optimisation-using-python.md

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,14 @@ The function `manualSearch()` manually iterates through the list (`ls`) and chec
111111

112112
```python
113113
import random
114+
from timeit import timeit
114115

115116
N = 2500 # Number of elements in list
116117
M = 2 # N*M == Range over which the elements span
117-
118-
def generateInputs():
119-
random.seed(12) # Ensure every list is the same
120-
return [random.randint(0, int(N*M)) for i in range(N)]
118+
random.seed(12) # Ensure every list is the same
119+
ls = [random.randint(0, int(N*M)) for i in range(N)]
121120

122121
def manualSearch():
123-
ls = generateInputs()
124122
ct = 0
125123
for i in range(0, int(N*M), M):
126124
for j in range(0, len(ls)):
@@ -129,16 +127,14 @@ def manualSearch():
129127
break
130128

131129
def operatorSearch():
132-
ls = generateInputs()
133130
ct = 0
134131
for i in range(0, int(N*M), M):
135132
if i in ls:
136133
ct += 1
137134

138135
repeats = 1000
139-
gen_time = timeit(generateInputs, number=repeats)
140-
print(f"manualSearch: {timeit(manualSearch, number=repeats)-gen_time:.2f}ms")
141-
print(f"operatorSearch: {timeit(operatorSearch, number=repeats)-gen_time:.2f}ms")
136+
print(f"manualSearch: {timeit(manualSearch, number=repeats):.2f}ms")
137+
print(f"operatorSearch: {timeit(operatorSearch, number=repeats):.2f}ms")
142138
```
143139

144140
This results in the manual Python implementation being 5x slower, doing the exact same operation!

0 commit comments

Comments
 (0)