|
import time |
|
import matplotlib.pyplot as plt |
|
|
|
def naive_sieve(m: int): |
|
BA = [True] * m |
|
for i, k in zip(range(2, m + 1), range(len(BA))): |
|
if BA[k] is False: continue |
|
for j in range(2, i): |
|
if i % j == 0: |
|
BA[k] = False |
|
f = k + j |
|
while f < len(BA): |
|
BA[f] = False |
|
f += j |
|
break |
|
return [i for i,j in zip(range(2, m + 1), BA) if j is True] |
|
|
|
def suboptimal_sieve(m: int): |
|
BA = [True] * m |
|
for i, k in zip(range(2, m + 1), range(2, len(BA))): |
|
if BA[k] is False: continue |
|
for j in range(i**2, m, i): |
|
BA[j] = False |
|
return [i for i,j in zip(range(2, m + 1), BA[2:]) if j is True] |
|
|
|
def fast_sieve(m: int): |
|
BA = [True] * m |
|
rtm = int(m**(1/2)) + 1 |
|
for i in range(2, len(BA)): |
|
if BA[i]: |
|
yield i |
|
if i < rtm: |
|
f = i |
|
while f < len(BA): |
|
BA[f] = False |
|
f += i |
|
|
|
def pidelport_sieve(limit): |
|
a = [True] * limit |
|
a[0] = a[1] = False |
|
for (i, isprime) in enumerate(a): |
|
if isprime: |
|
yield i |
|
for n in range(i*i, limit, i): |
|
a[n] = False |
|
|
|
def visualize_performance(): |
|
yt_naive = [] |
|
yt_suboptimal = [] |
|
yt_fast = [] |
|
yt_pidelport = [] |
|
xd = [x for x in range(100, 4501, 100)] |
|
|
|
for dt in xd: |
|
for f in [ |
|
[naive_sieve, yt_naive], |
|
[suboptimal_sieve, yt_suboptimal], |
|
[fast_sieve, yt_fast], |
|
[pidelport_sieve, yt_pidelport] |
|
]: |
|
t1 = time.time() |
|
f[0](dt) |
|
t2 = time.time() |
|
f[1].append(t2-t1) |
|
|
|
fig = plt.figure() |
|
gs = fig.add_gridspec(1, 2) |
|
line, box = gs.subplots(sharey=False) |
|
|
|
# Line graph |
|
line.plot(xd, yt_naive, label="Naive SOE") |
|
line.plot(xd, yt_suboptimal, label="Suboptimal SOE") |
|
line.plot(xd, yt_fast, label="Fast SOE") |
|
line.plot(xd, yt_pidelport, label="Pi Delport's SOE") |
|
line.set(xlabel="\nRange of Primes Computed", ylabel="Time Taken (Seconds)\n") |
|
line.set_title("Benchmark per Range") |
|
line.legend() |
|
|
|
# Box plot |
|
box.boxplot([yt_naive, yt_suboptimal, yt_fast, yt_pidelport]) |
|
box.set(xlabel="\nSOE Algorithms", xticklabels=["Naive", "Suboptimal", "Fast", "Pi Delport's"]) |
|
box.set_title("Average Benchmark Duration") |
|
|
|
plt.suptitle("Performance Comparison of \nVarious Implementations of the Sieve of Eratosthenes") |
|
plt.show() |
|
|
|
if __name__ == '__main__': |
|
visualize_performance() |