Skip to content

Instantly share code, notes, and snippets.

@halfprice06
Last active December 29, 2024 14:49
Show Gist options
  • Save halfprice06/e9b3ff692d9a5e74dc0c6204175985fd to your computer and use it in GitHub Desktop.
Save halfprice06/e9b3ff692d9a5e74dc0c6204175985fd to your computer and use it in GitHub Desktop.
fizz buzz testing
import timeit
def original():
for i in range(1, 101):
fizz = i % 3
buzz = i % 5
fizzbuzz = i % 15
if fizzbuzz == 0:
print(f"{i} = fizzbuzz")
elif fizz == 0:
print(f"{i} = fizz")
elif buzz == 0:
print(f"{i} = buzz")
def version1():
for i in range(1, 101):
result = ''
if i % 3 == 0: result += 'fizz'
if i % 5 == 0: result += 'buzz'
print(f"{i} = {result or i}")
def version2():
print('\n'.join(f"{i} = {'fizz'*(i%3==0) + 'buzz'*(i%5==0) or i}" for i in range(1, 101)))
def optimized():
for i in range(1, 101):
fizz = i % 3 == 0
buzz = i % 5 == 0
if fizz and buzz:
print(f"{i} = fizzbuzz")
elif fizz:
print(f"{i} = fizz")
elif buzz:
print(f"{i} = buzz")
else:
print(f"{i} = {i}")
def ultrafast():
# Pre-calculate all possible outputs to avoid string operations in the loop
outputs = {
(True, True): "fizzbuzz",
(True, False): "fizz",
(False, True): "buzz"
}
# Pre-calculate modulos for 1-100
fizzes = [i % 3 == 0 for i in range(101)]
buzzes = [i % 5 == 0 for i in range(101)]
for i in range(1, 101):
key = (fizzes[i], buzzes[i])
print(f"{i} = {outputs.get(key, i)}")
def o1s_version():
# Gather strings in a list, then print once
output = []
for i in range(1, 101):
if i % 15 == 0:
output.append(f"{i} = fizzbuzz")
elif i % 3 == 0:
output.append(f"{i} = fizz")
elif i % 5 == 0:
output.append(f"{i} = buzz")
else:
output.append(f"{i} = {i}")
print("\n".join(output))
# Disable print for accurate timing
from io import StringIO
import sys
original_stdout = sys.stdout
sys.stdout = StringIO()
# Time each version
n = 10000
time_original = timeit.timeit(original, number=n)
time_v1 = timeit.timeit(version1, number=n)
time_v2 = timeit.timeit(version2, number=n)
time_optimized = timeit.timeit(optimized, number=n)
time_ultrafast = timeit.timeit(ultrafast, number=n)
time_o1s_version = timeit.timeit(o1s_version, number=n)
# Restore stdout
sys.stdout = original_stdout
print(f"Original version: {time_original:.4f} seconds")
print(f"Sonnet Version 1: {time_v1:.4f} seconds")
print(f"Sonnet Version 2: {time_v2:.4f} seconds")
print(f"o1's Version: {time_o1s_version:.4f} seconds")
print(f"Sonnet Optimized: {time_optimized:.4f} seconds")
print(f"Sonnet Ultrafast: {time_ultrafast:.4f} seconds")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment