56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Scenario 1: The Obvious CPU Hog
|
|
===============================
|
|
This program counts prime numbers using trial division.
|
|
It's intentionally slow to demonstrate profiling.
|
|
|
|
EXERCISES:
|
|
1. Run with: time python3 prime_slow.py
|
|
2. Profile with: python3 -m cProfile -s cumtime prime_slow.py
|
|
3. Generate flamegraph: py-spy record -o prime_slow.svg -- python3 prime_slow.py
|
|
4. Identify the hot function, then see prime_fast.py for the optimized version
|
|
"""
|
|
|
|
import sys
|
|
|
|
|
|
def is_prime(n):
|
|
"""Check if n is prime using trial division."""
|
|
if n < 2:
|
|
return False
|
|
if n == 2:
|
|
return True
|
|
if n % 2 == 0:
|
|
return False
|
|
# Check odd divisors up to sqrt(n)
|
|
i = 3
|
|
while i * i <= n:
|
|
if n % i == 0:
|
|
return False
|
|
i += 2
|
|
return True
|
|
|
|
|
|
def count_primes(limit):
|
|
"""Count all primes up to limit."""
|
|
count = 0
|
|
for n in range(2, limit + 1):
|
|
if is_prime(n):
|
|
count += 1
|
|
return count
|
|
|
|
|
|
def main():
|
|
limit = 1_000_000 # Adjust this to change runtime
|
|
if len(sys.argv) > 1:
|
|
limit = int(sys.argv[1])
|
|
|
|
print(f"Counting primes up to {limit}...")
|
|
result = count_primes(limit)
|
|
print(f"Found {result} primes")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|