рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдХрд╣рд╛рдБ рдФрд░ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдореИрдиреБрдЕрд▓ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдкреНрд░реЛрдлрд╛рдЗрд▓рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЬ рд╣рдо рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдореБрдЦреНрдп рдФрд░ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдореВрд╣ - рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред
рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ
рдпреВрд▓рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ
рдЯрд╛рд╕реНрдХ 3 рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдерд╛ред рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╣рдо рдХреБрдЫ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рдВрдЧреНрд░рд╣ рд╕реЗ
рдХрд╛рд░реНрдп 7 :
рдкрд╣рд▓реЗ рдЫрд╣ рдЕрдкрд░рд╛рдзреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ 2, 3, 5, 7, 11 рдФрд░ 13 рдорд┐рд▓рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, 6 рд╡рд╛рдВ рдЕрднрд╛рдЬреНрдп 13 рд╣реИред
10001 рд╡рд╛рдБ рдЕрднрд╛рдЬреНрдп рд╕рдВрдЦреНрдпрд╛ рдХреМрди рд╕реА рд╣реИ?
рд╣рдо рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
"""Project Euler problem 7 solve""" from __future__ import print_function import math import sys def is_prime(num): """Checks if num is prime number""" for i in range(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True def get_prime_numbers(count): """Get 'count' prime numbers""" prime_numbers = [2] next_number = 3 while len(prime_numbers) < count: if is_prime(next_number): prime_numbers.append(next_number) next_number += 1 return prime_numbers if __name__ == '__main__': try: count = int(sys.argv[1]) except (TypeError, ValueError, IndexError): sys.exit("Usage: euler_7.py number") if count < 1: sys.exit("Error: number must be greater than zero") prime_numbers = get_prime_numbers(count) print("Answer: %d" % prime_numbers[-1])
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреЛрдб рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрдИ рдЪреАрдЬреЗрдВ рдЖрд╕рд╛рди, рдмреЗрд╣рддрд░, рддреЗрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ =)
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ
рд╢рд░реНрдорд┐рдВрджрд╛ рдерд╛ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛: рдкрд░реАрдХреНрд╖рдгред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдпрд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддреЛрдбрд╝рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдФрд░ рд░реАрд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг (рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕реАрдзреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдРрд╕реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рд╣реИрдВ)ред рдЖрдЗрдП рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк
рд╕рд┐рджреНрдзрд╛рдВрдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдПрдВ:
рдкрд░реАрдХреНрд╖рдг """Project Euler problem 7 solve""" from __future__ import print_function import math import sys def is_prime(num): """ Checks if num is prime number. >>> is_prime(2) True >>> is_prime(3) True >>> is_prime(4) False >>> is_prime(5) True >>> is_prime(41) True >>> is_prime(42) False >>> is_prime(43) True """ for i in range(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True def get_prime_numbers(count): """ Get 'count' prime numbers. >>> get_prime_numbers(1) [2] >>> get_prime_numbers(2) [2, 3] >>> get_prime_numbers(3) [2, 3, 5] >>> get_prime_numbers(6) [2, 3, 5, 7, 11, 13] >>> get_prime_numbers(9) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> get_prime_numbers(19) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67] """ prime_numbers = [2] next_number = 3 while len(prime_numbers) < count: if is_prime(next_number): prime_numbers.append(next_number) next_number += 1 return prime_numbers if __name__ == '__main__': try: count = int(sys.argv[1]) except (TypeError, ValueError, IndexError): sys.exit("Usage: euler_7.py number") if count < 1: sys.exit("Error: number must be greater than zero") prime_numbers = get_prime_numbers(count) print("Answer: %d" % prime_numbers[-1])
рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ тЮЬ python -m doctest -v euler_7.py Trying: get_prime_numbers(1) Expecting: [2] ok Trying: get_prime_numbers(2) Expecting: [2, 3] ok Trying: get_prime_numbers(3) Expecting: [2, 3, 5] ok Trying: get_prime_numbers(6) Expecting: [2, 3, 5, 7, 11, 13] ok Trying: get_prime_numbers(9) Expecting: [2, 3, 5, 7, 11, 13, 17, 19, 23] ok Trying: get_prime_numbers(19) Expecting: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67] ok Trying: is_prime(2) Expecting: True ok Trying: is_prime(3) Expecting: True ok Trying: is_prime(4) Expecting: False ok Trying: is_prime(5) Expecting: True ok Trying: is_prime(41) Expecting: True ok Trying: is_prime(42) Expecting: False ok Trying: is_prime(43) Expecting: True ok 1 items had no tests: euler_7 2 items passed all tests: 6 tests in euler_7.get_prime_numbers 7 tests in euler_7.is_prime 13 tests in 3 items. 13 passed and 0 failed. Test passed.
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреЛрдб рдХрд┐рддрдиреА рдЬрд▓реНрджреА рдорд┐рд▓рд╛:
тЮЬ python -m timeit -n 10 -s'import euler_7' 'euler_7.get_prime_numbers(10001)' 10 loops, best of 3: 1.27 sec per loop
рд╣рд╛рдВ, рддреЗрдЬ рдирд╣реАрдВ, рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ =)
рдЙрдкрдХрд░рдг
рдорд╛рдирдХ рдЕрдЬрдЧрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдореЗрдВ рд╣рдбрд╝рддрд╛рд▓реА рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рддреАрди "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╣реИрдВ:
- cProfile рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ (рд╕рдВрд╕реНрдХрд░рдг 2.5 рдХреЗ рдмрд╛рдж рд╕реЗ) C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рддреЗрдЬрд╝ рд╣реИ
- рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ - рджреЗрд╢реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд┐рдд), рдзреАрдорд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ
- рд╣реЙрдЯрд╢реЙрдЯ - рд╕реА рдореЗрдВ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдореЙрдбреНрдпреВрд▓, рдмрд╣реБрдд рддреЗрдЬрд╝, рд▓реЗрдХрд┐рди рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдордп рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
cProfile
рдЕрдЬрдЧрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдмрд╛рдд рдмрд┐рдирд╛
cProfile рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ - рдорд╛рдирдХ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реЗ рдПрдХ?
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рд░ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ cProfile рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ:
тЮЬ python -m cProfile -s time euler_7.py 10001 428978 function calls in 1.552 seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 104741 0.955 0.000 1.361 0.000 euler_7.py:7(is_prime) 104741 0.367 0.000 0.367 0.000 {range} 1 0.162 0.162 1.550 1.550 euler_7.py:32(get_prime_numbers) 104741 0.039 0.000 0.039 0.000 {math.sqrt} 104742 0.024 0.000 0.024 0.000 {len} 10000 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects} 1 0.001 0.001 1.552 1.552 euler_7.py:1(<module>) 1 0.000 0.000 0.000 0.000 {print} 1 0.000 0.000 0.000 0.000 __future__.py:48(<module>) 7 0.000 0.000 0.000 0.000 __future__.py:75(__init__) 1 0.000 0.000 0.000 0.000 __future__.py:74(_Feature) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдВ: рдмрд┐рдирд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ: 1.27 рд╕реЗрдХрдВрдб, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде: 1.55 рд╕реЗрдХрдВрдб, рдпрд╛рдиреА рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ 20% рдзреАрдорд╛ред рдФрд░ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ!рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрд╕реЗ рд▓рдВрдмрд╛ (рдХреБрд▓ рд╕рдордп рдореЗрдВ) рдСрдкрд░реЗрд╢рди
is_prime рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рд╕рдордп рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ "рдЧрдВрднреАрд░рддрд╛" рдХреЙрд▓
рд░реЗрдВрдЬ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд┐рд░реНрдл is_prime рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╕реАрдорд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреА рдЧрдИ рд╕реАрдорд╛ рд╕реЗ рд╕рднреА рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд░реЗрдВрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ 104741 рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░реЗрдВрдЬ рдХреА рдКрдкрд░реА рд╕реАрдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рдИ рдЬрд╛рддреА рд╣реИ (рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ), рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реЗрдВрдЬ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдВрдд рддрдХ рд╕реИрдХрдбрд╝реЛрдВ рд╣рдЬрд╛рд░реЛрдВ рдЖрдЗрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрддреА рд╣реИ рдФрд░ рд╕реВрдЪреА рдПрдХ рд╕реМ рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рд╕рдордпред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж
, рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдЪрдХреНрд░ рдореЗрдВ
xrange рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдХреЛ рдЗрд╕ рдЬрдЧрд╣ рдореЗрдВ рд╡реНрдпрдВрдЧреНрдп рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА pythonist рд░реЗрдВрдЬ VS xrange рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ)ред рдПрдХреНрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд░реЗрдВрдЬ рдХреА рдЬрдЧрд╣ рдХрд╛ рд▓рд╛рдн рднреА рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рдмрдЪрдд рд╣реЛрдЧрд╛ (рд╣рдо рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдмрд╛рдж рдореЗрдВ рдЬрд╛рдВрдЪреЗрдВрдЧреЗ)ред рдмрджрд▓реЗрдВ, рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ: рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдЪрд▓рд╛рдПрдВ:
тЮЬ python -m cProfile -s time euler_7.py 10001 324237 function calls in 1.010 seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 104741 0.825 0.000 0.857 0.000 euler_7.py:7(is_prime) 1 0.127 0.127 1.009 1.009 euler_7.py:32(get_prime_numbers) 104741 0.032 0.000 0.032 0.000 {math.sqrt} 104742 0.022 0.000 0.022 0.000 {len} 10000 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects} 1 0.001 0.001 1.010 1.010 euler_7.py:1(<module>) 1 0.000 0.000 0.000 0.000 {print} 1 0.000 0.000 0.000 0.000 __future__.py:48(<module>) 7 0.000 0.000 0.000 0.000 __future__.py:75(__init__) 1 0.000 0.000 0.000 0.000 __future__.py:74(_Feature) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1.552 рдХреЗ рдмрдЬрд╛рдп 1.010 рд╕реЗрдХрдВрдб, рдпрд╛рдиреА рдбреЗрдврд╝ рдЧреБрдирд╛ рддреЗрдЬ! рд╕рд╛рдорд╛рдиреНрдпред рдЕрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЕрдбрд╝рдЪрди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ
is_prime рдлрд╝рдВрдХреНрд╢рди рд╣реИред рд╣рдо рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, -o рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
тЮЬ python -m cProfile -o euler_7.prof euler_7.py 10001 тЮЬ ls euler_7.prof euler_7.py
рдпрд╛ рдЖрдк рд╕рдмрд╕реЗ рд╕рд░рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import cProfile def profile(func): """Decorator for run function profile""" def wrapper(*args, **kwargs): profile_filename = func.__name__ + '.prof' profiler = cProfile.Profile() result = profiler.runcall(func, *args, **kwargs) profiler.dump_stats(profile_filename) return result return wrapper @profile def get_prime_numbers(count): ...
рдФрд░ рдлрд┐рд░ foo рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде, рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреА рдЬрд╛рдПрдЧреА (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ "get_prime_numbers.prof")ред
тВм рд╛рдп
рд╣реЙрдЯрд╢реЙрдЯ - рдПрдХ рдФрд░ рдорд╛рдирдХ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдордп рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдпрд╣ рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдиреНрдпреВрдирддрдо рдУрд╡рд░рд╣реЗрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
import hotshot prof = hotshot.Profile("profile_name.prof") prof.start()
рдпрд╛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ:
import hotshot def profile(func): """Decorator for run function profile""" def wrapper(*args, **kwargs): profile_filename = func.__name__ + '.prof' profiler = hotshot.Profile(profile_filename) profiler.start() result = func(*args, **kwargs) profiler.stop() profiler.close() return result return wrapper @profile def get_prime_numbers(count): ...
рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпрд╣ рджреБрд░реНрд▓рдн рд╣реИ рдЬрдм рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдВ, рдФрд░ рдРрд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рд╣реИ: рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ рдирд┐рд░реНрдорд┐рдд
pstats рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ (рдЕрджреНрднреБрдд
iPython рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ):
тЮЬ ipython In [1]: import pstats In [2]: p = pstats.Stats('get_prime_numbers.prof') In [3]: p.sort_stats('calls').print_stats() 324226 function calls in 1.018 seconds Ordered by: call count ncalls tottime percall cumtime percall filename:lineno(function) 104742 0.023 0.000 0.023 0.000 {len} 104741 0.821 0.000 0.854 0.000 euler_7.py:19(is_prime) 104741 0.034 0.000 0.034 0.000 {math.sqrt} 10000 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects} 1 0.138 0.138 1.018 1.018 euler_7.py:44(get_prime_numbers)
рдХрдВрд╕реЛрд▓, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рджреГрд╢реНрдп рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдард┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╕реИрдХрдбрд╝реЛрдВ рдФрд░ рд╣рдЬрд╛рд░реЛрдВ рдЪреБрдиреМрддрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрддрдирд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА (рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЛ рдкрд╛рдареНрдп рд╕реВрдЪрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдг рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
kcachegrind
рдореИрдВ рд╢рд╛рдпрдж
kcachegrind рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ
рдХрд░реВрдБрдЧрд╛ , рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
Callgrind рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ, рдЙрдиреНрд╣реЗрдВ kcachegrind рдореЗрдВ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд░реВрдкрд╛рдВрддрд░рдг pyprof2calltree рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
тЮЬ pip install pyprof2calltree тЮЬ pyprof2calltree -i profile_results.prof -o profile_results.kgrind
рдЖрдк рддреБрд░рдВрдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗ рдмрд┐рдирд╛, kcachegrind рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
тЮЬ pyprof2calltree -i profile_results.prof -k
рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдкрдХреЛ рдиреЗрддреНрд░рд╣реАрди рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓ рдХреЛ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдХреЙрд▓ рднреАред рдЖрдк рдХреЙрд▓ рдЯреНрд░реА рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

RunSnakeRun
RunSnakeRun рдХреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдЬрдЧрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ (рдЗрд╕реЗ рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ kcachegrind рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓ рд░реВрдк рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд╛рдкрдирд╛ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛:
тЮЬ brew install wxwidgets тЮЬ pip install SquareMap RunSnakeRun
рдЙрдкрдпреЛрдЧ рднреА:
тЮЬ runsnake profile_results.prof
рдЙрд╕реА рддрд░рд╣, рд╣рдо рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рджреЗрдЦрддреЗ рд╣реИрдВ: рд╡рд░реНрдЧ рдХрд╛ рдХреНрд╖реЗрддреНрд░рдлрд▓ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рд╕рдордп рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ:

RunSnakeRun рдЖрдкрдХреЛ
рдореЗрд▓рд┐рдпрд╛ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

gprof2dot
Gprof2dot рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдкреЗрдбрд╝ рдФрд░ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЪрд┐рддреНрд░ рд╕реЗрдЯ рдФрд░ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ:
тЮЬ brew install graphviz тЮЬ pip install gprof2dot тЮЬ gprof2dot -f pstats profile_results.prof | dot -Tpng -o profile_results.png
рдкрд░рд┐рдгрд╛рдо:

Django рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ
Django рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣
django- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЙрдкрдпреЛрдЧреА рд░рдирдкреНрд░реЛрдлрд╛рдЗрд▓рд╕реЗрд╡рд░ рдХрдорд╛рдВрдб рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдо рдбрд╛рд▓рддреЗ рд╣реИрдВ:
тЮЬ pip install django-extensions
рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ:
INSTALLED_APPS += ('django_extensions',)
рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
тЮЬ python manage.py runprofileserver --use-cprofile --prof-path=/tmp/prof/
/ Tmp / prof / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА:
тЮЬ ls /tmp/prof/ admin.000276ms.1374075009.prof admin.account.user.000278ms.1374075014.prof admin.jsi18n.000185ms.1374075018.prof favicon.ico.000017ms.1374075001.prof root.000073ms.1374075004.prof static.admin.css.base.css.000011ms.1374075010.prof static.admin.css.forms.css.000013ms.1374075017.prof static.admin.img.icon-yes.gif.000001ms.1374075015.prof static.admin.img.sorting-icons.gif.000001ms.1374075015.prof static.admin.js.core.js.000018ms.1374075014.prof static.admin.js.jquery.js.000003ms.1374075014.prof static.css.bootstrap-2.3.2.min.css.000061ms.1374074996.prof static.img.glyphicons-halflings.png.000001ms.1374075005.prof static.js.bootstrap-2.3.2.min.js.000004ms.1374074996.prof static.js.jquery-2.0.2.min.js.000001ms.1374074996.prof user.login.000187ms.1374075001.prof
рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЧреЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: pstats, kcachegrind, RunSnakeRun рдпрд╛ gprof2dotред рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп =)
рдкрд╛рдпрдерди рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдПрдХ рдЯрди рднреА рд╣реИ, рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓, рдЙрдкрдпреЛрдЧреА рдФрд░ рдмрд╣реБрдд рдирд╣реАрдВред
pycallgraph
pycallgraph рдЖрдкрдХреЛ Python рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЙрд▓ рдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдбрд╛рд▓рддреЗ рд╣реИрдВ:
тЮЬ brew install graphviz тЮЬ pip install pycallgraph
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
тЮЬ pycallgraph graphviz -- euler_7.py 10001 тЮЬ open pycallgraph.png

line_profiler
рд▓рд╛рдЗрди_рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ , рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдирд╛рдо рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ, рдХреЛрдб рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдбрд╛рд▓рддреЗ рд╣реИрдВ:
тЮЬ pip install line_profiler
"рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓" рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬреЛрдбрд╝реЗрдВ (рдореИрдВрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ:)
@profile def is_prime(num): for i in xrange(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True @profile def get_prime_numbers(count): prime_numbers = [2] next_number = 3 while len(prime_numbers) < count: if is_prime(next_number): prime_numbers.append(next_number) next_number += 1 return prime_numbers
рд╣рдо рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
тЮЬ kernprof.py -v -l euler_7.py 10001 Wrote profile results to euler_7.py.lprof Timer unit: 1e-06 s File: euler_7.py Function: is_prime at line 7 Total time: 10.7963 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 7 @profile 8 def is_prime(num): 9 2935963 5187211 1.8 48.0 for i in xrange(2, int(math.sqrt(num)) + 1): 10 2925963 5421919 1.9 50.2 if num % i == 0: 11 94741 169309 1.8 1.6 return False 12 10000 17904 1.8 0.2 return True File: euler_7.py Function: get_prime_numbers at line 15 Total time: 23.263 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 15 @profile 16 def get_prime_numbers(count): 17 1 5 5.0 0.0 prime_numbers = [2] 18 1 3 3.0 0.0 next_number = 3 19 20 104742 208985 2.0 0.9 while len(prime_numbers) < count: 21 104741 22843717 218.1 98.2 if is_prime(next_number): 22 10000 22405 2.2 0.1 prime_numbers.append(next_number) 23 104741 187927 1.8 0.8 next_number += 1 24 25 1 2 2.0 0.0 return prime_numbers
рд╣рдо рддреБрд░рдВрдд рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ: рдХрд╛рд░реНрдпрдХреНрд░рдо 30 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЪрд▓рд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдмрд┐рдирд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ, рдпрд╣ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИредрдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо 9 рдФрд░ 10 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА "рд╕рд╛рджрдЧреА" рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдорд╛рди рдЪреЗрдХ рд╣реЛрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ рдЙрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
def is_prime(num, prime_numbers): """ Checks if num is prime number. >>> is_prime(2, []) True >>> is_prime(3, [2]) True >>> is_prime(4, [2, 3]) False >>> is_prime(5, [2, 3]) True >>> is_prime(41, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]) True >>> is_prime(42, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]) False >>> is_prime(43, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]) True """ limit = int(math.sqrt(num)) + 1 for i in prime_numbers: if i > limit: break if num % i == 0: return False return True def get_prime_numbers(count): """ Get 'count' prime numbers. >>> get_prime_numbers(1) [2] >>> get_prime_numbers(2) [2, 3] >>> get_prime_numbers(3) [2, 3, 5] >>> get_prime_numbers(6) [2, 3, 5, 7, 11, 13] >>> get_prime_numbers(9) [2, 3, 5, 7, 11, 13, 17, 19, 23] >>> get_prime_numbers(19) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67] """ prime_numbers = [2] next_number = 3 while len(prime_numbers) < count: if is_prime(next_number, prime_numbers): prime_numbers.append(next_number) next_number += 1 return prime_numbers
рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ:
тЮЬ python -m timeit -n 10 -s'import euler_7' 'euler_7.get_prime_numbers(10001)' 10 loops, best of 3: 390 msec per loop
рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╛рдо рдХреЛ рд▓рдЧрднрдЧ рддреАрди рдмрд╛рд░ рддреЗрдЬ рдХрд┐рдпрд╛, рдмреБрд░рд╛ рдирд╣реАрдВред рдПрдХ рдмрд╛рд░ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдЪрд▓рд╛рдПрдВ:
тЮЬ kernprof.py -v -l euler_7.py 10001 Wrote profile results to euler_7.py.lprof Timer unit: 1e-06 s File: euler_7.py Function: is_prime at line 7 Total time: 4.54317 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 7 @profile 8 def is_prime(num, prime_numbers): 9 104741 310160 3.0 6.8 limit = int(math.sqrt(num)) + 1 10 800694 1296045 1.6 28.5 for i in prime_numbers: 11 800692 1327770 1.7 29.2 if i > limit: 12 9998 17109 1.7 0.4 break 13 790694 1409731 1.8 31.0 if num % i == 0: 14 94741 165761 1.7 3.6 return False 15 10000 16599 1.7 0.4 return True File: euler_7.py Function: get_prime_numbers at line 18 Total time: 10.5464 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 18 @profile 19 def get_prime_numbers(count): 20 1 4 4.0 0.0 prime_numbers = [2] 21 1 2 2.0 0.0 next_number = 3 22 23 104742 202443 1.9 1.9 while len(prime_numbers) < count: 24 104741 10143489 96.8 96.2 if is_prime(next_number, prime_numbers): 25 10000 22374 2.2 0.2 prime_numbers.append(next_number) 26 104741 178074 1.7 1.7 next_number += 1 27 28 1 1 1.0 0.0 return prime_numbers
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдЪрд▓рдиреЗ рд▓рдЧрд╛ред
memory_profiler
рдЖрдк рдореЗрдореЛрд░реА рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
memory_profiler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рд╛рдЗрди_рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рд╕рдорд╛рди рд╕рд░рд▓ рд╣реИред рд╣рдо рдбрд╛рд▓рддреЗ рд╣реИрдВ:
тЮЬ pip install psutil memory_profiler
рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
тЮЬ python -m memory_profiler euler_7.py 10001 Filename: euler_7.py Line # Mem usage Increment Line Contents ================================================ 18 8.441 MiB -0.531 MiB @profile 19 def get_prime_numbers(count): 20 8.445 MiB 0.004 MiB prime_numbers = [2] 21 8.445 MiB 0.000 MiB next_number = 3 22 23 8.973 MiB 0.527 MiB while len(prime_numbers) < count: 24 if is_prime(next_number, prime_numbers): 25 8.973 MiB 0.000 MiB prime_numbers.append(next_number) 26 8.973 MiB 0.000 MiB next_number += 1 27 28 8.973 MiB 0.000 MiB return prime_numbers Filename: euler_7.py Line # Mem usage Increment Line Contents ================================================ 7 8.973 MiB 0.000 MiB @profile 8 def is_prime(num, prime_numbers): 9 8.973 MiB 0.000 MiB limit = int(math.sqrt(num)) + 1 10 8.973 MiB 0.000 MiB for i in prime_numbers: 11 8.973 MiB 0.000 MiB if i > limit: 12 8.973 MiB 0.000 MiB break 13 8.973 MiB 0.000 MiB if num % i == 0: 14 8.973 MiB 0.000 MiB return False 15 8.973 MiB 0.000 MiB return True
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реИред
рдЕрдзрд┐рдХ рдЙрдкрдХрд░рдг
рдореИрдВ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЯреВрд▓ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реВрдВрдЧрд╛, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдЦ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
- рдбреЙрдЬрд░ - рдПрдХ рдорд╣рд╛рди рдореЗрдореЛрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓
- рдЧрдкреНрдкреА рдПрдХ рдЕрдиреНрдп рдореЗрдореЛрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ
- Meliae рдкрд╣рд▓реЗ рдмрддрд╛рдИ рдЧрдИ рдореЗрдореЛрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк RunSnakeRun рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- muppy - рдореЗрдореЛрд░реА рд▓реАрдХ рдбрд┐рдЯреЗрдХреНрд╢рди
- рд╕реНрдореГрддрд┐ - рдлрд┐рд░ рд╕реЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ
- objgraph рд╡рд╕реНрддреБрдУрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдХрд░рдг рд╣реИ
рд╣рдордиреЗ рдкрд╛рдпрдерди рдХреЛрдб рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рд░рд╣реЗ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреВрд░рдХ рдХрд░реЗрдВрдЧреЗред
рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдЙрдкрдХрд░рдг рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗред рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд░рд╣реЗрдВ!
рдЖрдБрдХрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рдкрд▓: рдкрд╛рдпрдерди рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреАрди рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ "рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ" рд╢рдмреНрдж рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ред