- Instead of using dict to store values of
m
and C
define both as distinct variables and make the dict only when returning:
m = []
C = []
...
return {"m": m, "C": C}, lattice
You could also use a deque instead of a list, which should be faster than a list.
When an if
-statement has an and
-condition in it, the second condition is not valuated if it doesn't effect the value of the statement. In other words, if you can figure out which statement is more likely to fail and you valuate it first, you save some time by failing faster.
With list appends, you save time by pre-allocating the append to its own variable:
m = []
C = []
app_m = m.append
app_C = C.append
for i in range(r):
if i % 3 == 0:
app_m(i)
app_C(i)
If you haven't tried profiling your code to figure out what takes time, I would suggest doing that.
Script to evaluate point 1-3:
import timeit
from collections import deque
# for range
r = 20000
# timeit n times
ntimes = 500
def dicts():
d = {"m": [], "C": []}
for i in range(r):
if i % 3 == 0:
d["m"].append(i)
d["C"].append(i)
return d
def lists():
m = []
C = []
for i in range(r):
if i % 3 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
def deques():
m = deque(maxlen=r)
C = deque(maxlen=r)
for i in range(r):
if i % 3 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
t1 = timeit.timeit(dicts, number=ntimes)
t2 = timeit.timeit(lists, number=ntimes)
t3 = timeit.timeit(deques, number=ntimes)
print("dicsts", t1)
print("lists ", t2)
print("deques", t3)
def order1():
m = []
C = []
for i in range(r):
if i % 2 == 0 and i % 5 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
def order2():
m = []
C = []
for i in range(r):
if i % 5 == 0 and i % 2 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
t1 = timeit.timeit(order1, number=ntimes)
t2 = timeit.timeit(order2, number=ntimes)
print("order1", t1)
print("order2", t2)
def listsappend():
m = []
C = []
app_m = m.append
app_C = C.append
for i in range(r):
if i % 3 == 0:
app_m(i)
app_C(i)
return {"m": m, "C": C}
t1 = timeit.timeit(lists, number=ntimes)
t2 = timeit.timeit(listsappend, number=ntimes)
print("normal", t1)
print("predef", t2)