Last active
December 29, 2024 14:49
-
-
Save halfprice06/e9b3ff692d9a5e74dc0c6204175985fd to your computer and use it in GitHub Desktop.
fizz buzz testing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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