ååã®èšäºã§ã¯ããããã¡ã€ãªã³ã°ãšæé©åã®æŠå¿µãå®çŸ©ãããããã¡ã€ãªã³ã°ãšããŒã«ã®çš®é¡ã«å¯ŸããããŸããŸãªã¢ãããŒãã«ç²ŸéããŸããã ãããã¡ã€ã©ãŒã®æŽå²ã«å°ã觊ããŸããã
æ¬æ¥ã¯ãå®è·µã«ç§»ãããšãææ¡ããæåãããã¡ã€ãªã³ã°ææ³ïŒããã³ã泚èŠææ³ãïŒã®äŸã瀺ããŸãã
- å°å
¥ãšçè« -ãªããããã¡ã€ãªã³ã°ãç°ãªãã¢ãããŒããããŒã«ãããã³ãããã®éããå¿
èŠãªã®ã§ããïŒ
- æåããã³çµ±èšãããã¡ã€ãªã³ã° -å®è·µã«ç§»ããŸããã
- ã€ãã³ããããã¡ã€ãªã³ã° -ããŒã«ãšãã®ã¢ââããªã±ãŒã·ã§ã³
- ãããã° -äœãæ©èœããªãå Žåã®å¯ŸåŠæ¹æ³
ãã¬ãŒãã³ã°
äŸããã¬ãŒãã³ã°ãªãã§å®è·µã§ããããšã¯äœã§ããïŒ ç§ã¯é·ãéãã©ã®ãããªãããžã§ã¯ããæè²ããŒã«ãšããŠæ¡çšãã䟡å€ãããããèããŠããŸããã ç§ã®æèŠã§ã¯ãããã¯
ãããžã§ã¯ããªã€ã©ãŒ -æ°åŠããã³ã³ã³ãã¥ãŒã¿ãŒããºã«ã®ã³ã¬ã¯ã·ã§ã³ã§ããææ¡ãããåé¡ã解決ããã«ã¯æ°å€ã¢ã«ãŽãªãºã ã䜿çšããå¿
èŠããããæé©åããã«çããæ¢ãã®ã¯äœå¹Žãç¶ãããšãããããã§ãã
äžè¬ã«ããªã€ã©ãŒãããžã§ã¯ãã®ããºã«ã解ãããšã匷ããå§ãããŸãã æ°ãæ£ãããçæ³ãããªã©ãã¯ã¹ããåæã«è³ãè¯ãç¶æ
ã«ä¿ã€ã®ã«åœ¹ç«ã¡ãŸããèšäºã®äŸãšããŠã
ã¿ã¹ã¯3ãåã
ãŸã ã
13195ã®çŽ æ°ã¯5ã7ã13ãããã³29ã§ãã
çŽ æ°ã§ãã600851475143ã®æ倧ã®é€æ°ã¯äœã§ããïŒ
ãé¡ããšããç°¡åãªãœãªã¥ãŒã·ã§ã³ãäœæããŸãã
"""Project Euler problem 3 solve""" from __future__ import print_function import sys def is_prime(num): """Checks if num is prime number""" for i in range(2, num): if not num % i: return False return True def find_prime_factors(num): """Find prime factors of num""" result = [] for i in range(2, num): if is_prime(i) and not num % i: result.append(i) return result if __name__ == '__main__': try: num = int(sys.argv[1]) except (TypeError, ValueError, IndexError): sys.exit("Usage: euler_3.py number") if num < 1: sys.exit("Error: number must be greater than zero") prime_factors = find_prime_factors(num) if len(prime_factors) == 0: print("Can't find prime factors of %d" % num) else: print("Answer: %d" % prime_factors[-1])
æ°é
ãã®ããããŸãã¯çµéšè±å¯ãªèªè
ã¯ãããã«ç§ãnoobãšåŒã³ããã®ããã°ã©ã ã®åé¡ã«ååãä»ãããã®æé©åã®ããã®ããã€ãã®ã¬ã·ããäžãããããããŸããããç¹å¥ãªç°¡åãªäŸãåãäžããŠããã®ã³ãŒããè¯ããšèããŠãããµããããŠãéäžã§æé©åããŸãã確èªããã«ã¯ãé€æ°ãããã£ãŠããæ°åã䜿çšããŠããã°ã©ã ãå®è¡ããŸãã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 13195
åçïŒ29
ããã°ã©ã ã«ãã£ãŠçºè¡ãããåç29ã¯æ£ããã§ãïŒåé¡ã®èª¬æã«èšèŒãããŠããŸãïŒã ãã£ãïŒ æ¬¡ã«ãèå³ã®ããçªå·600851475143ã§ããã°ã©ã ãå®è¡ããŸãã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 600851475143
ãããŠ...äœãèµ·ãããŸããã CPU䜿çšçã¯100ïŒ
ã§ãããã°ã©ã ã¯æ°æéæäœããåŸã§ãå®äºããŠããŸããã ç§ãã¡ã¯ç解ãå§ããŸãã æ£ããåäœããã³ãŒãã®ã¿ãæé©åã§ããããšãæãåºããŸãããããã°ã©ã ãå°æ°ã§ç¢ºèªããçãã¯æ£ããã£ãããšãæãåºããŸãã æããã«ãåé¡ã¯ããã©ãŒãã³ã¹ã«ãããæé©åãéå§ããå¿
èŠããããŸãã
èŠç·æ³
å®éã«ã¯ãåŒæ°13195ã§ããã°ã©ã ã®ãããã¡ã€ã«ãäœæããŸãïŒåäœæéãé©åãªå ŽåïŒã ããããç§ãã¡ã¯ããã§ããããŠäžè¬çã«6æã®ããã«ãã¬ãŒãã³ã°ããŠããã®ã§ãã泚èŠæ³ãã䜿çšããŸãã
ã³ãŒããéãã泚ææ·±ã調ã¹ãŸãã æ°
Nã®çŽæ°ãæ€çŽ¢ããããã«ãéé
sqrtïŒNïŒ+ 1 ... N-1ããæ°ãæŽçããããšã¯æå³ããªãããšãç解ããŸãïŒå¹žéãªãããã«ç解ããŸãïŒ
ã éé
2 ... sqrtïŒNïŒã®æ°å€ãå埩åŠçãããšãã«ããã®ç¯å²ã®ãã¹ãŠã®é€æ°ãæ¢ã«èŠã€ãããŸããã ã³ãŒããå°ãå€æŽããŸãïŒ9è¡ç®ãš18ââè¡ç®ãåç
§ïŒã
"""Project Euler problem 3 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 not num % i: return False return True def find_prime_factors(num): """Find prime factors of num""" result = [] for i in range(1, int(math.sqrt(num)) + 1): if is_prime(i) and not num % i: result.append(i) if is_prime(num): result.append(i) return result if __name__ == '__main__': try: num = int(sys.argv[1]) except (TypeError, ValueError, IndexError): sys.exit("Usage: euler_3.py number") if num < 1: sys.exit("Error: number must be greater than zero") prime_factors = find_prime_factors(num) if len(prime_factors) == 0: print("Can't find prime factors of %d" % num) else: print("Answer: %d" % prime_factors[-1])
確èªããã«ã¯ãé€æ°ãããã£ãŠããæ°ã§ããã°ã©ã ãå床å®è¡ããŸãã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 13195
åçïŒ29
䞻芳çã«ã¯ãããã°ã©ã ã¯ã¯ããã«éãåäœããŸãããã€ãŸããèå³ã®ããçªå·600851475143ã§ããã°ã©ã ãåã³èµ·åããããšãæå³ããŸãã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 600851475143
åçïŒ6857
ç§ãã¡ã¯ãµã€ãã§çãã確èªããæ£ããããšãå€æããåé¡ã解決ãããé埳çãªæºè¶³ãæããŠããŸãã
ããã°ã©ã ã¯èš±å®¹å¯èœãªæéïŒ1åæªæºïŒã§å®äºããŸãããçãã¯æ£ããã£ãã®ã§ããã®ç¹å®ã®ã±ãŒã¹ã§ããã«æé©åããæå³ã¯ãããŸããã ã¿ã¹ã¯ã解決ããŸããã èŠããŠããããã«ãæé©åã§æãéèŠãªããšã¯ãæéå
ã«åæ¢ã§ããããšã§ãã
ã¯ããProject Eulerã®ã¡ã³ããŒããããªãã¯ãã¡ã€ã³ã§åçãšãœãªã¥ãŒã·ã§ã³ãå
±æããªãããã«æ±ããŠããããšã¯æ¿ç¥ããŠããŸãã ããããã¿ã¹ã¯3ã®çãã¯ã°ãŒã°ã«ã§ãïŒããšãã°ãããããžã§ã¯ããªã€ã©ãŒåé¡3ã®çãããšããæ¡ä»¶ã§äžåºŠã«çããã®ã§ãçããæžããŠã倧äžå€«ã ãšæããŸãïŒãæåãããã¡ã€ãªã³ã°
äœãäœã§ãããããã°ããææ¡ããæãäžè¬çãªæ¹æ³ã®1ã€ã æãåºæ¬çãªã±ãŒã¹ã§ã¯ãunixãŠãŒãã£ãªãã£ãtimeãã䜿çšãããšã次ã®ããã«ãªããŸãïŒæé©ååïŒã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âæépython euler_3.py 13195
åçïŒ29
python euler_3.py 13195 3.83sãŠãŒã¶ãŒ0.03sã·ã¹ãã 99ïŒ
CPU 3.877åèš
ïŒæé©ååŸïŒïŒ
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âæépython euler_3.py 13195
åçïŒ29
python euler_3.py 13195 0.03sãŠãŒã¶ãŒ0.02sã·ã¹ãã 90ïŒ
cpu 0.061åèš
ã»ãŒ65åã®å éïŒã3.87ç§ããã61ããªç§ïŒïŒ
æåãããã¡ã€ãªã³ã°ã次ã®ããã«ãªããŸãã
import time ... start = time.time() prime_factors = find_prime_factors(num) print("Time: %.03f s" % (time.time() - start))
çµæïŒ
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 600851475143
åçïŒ6857
æéïŒ19.811ç§
ãŸãã¯ãå°ããªããã°ã©ã ã®ããã©ãŒãã³ã¹ã枬å®ããããã«èšèšãããç¹å¥ãªã
timeit ãã¢ãžã¥ãŒã«ã䜿çšããŸãã é©çšäŸïŒ
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython -m timeit -n 10 -s'import euler_3 '' euler_3.find_prime_factorsïŒ600851475143ïŒ '
10ã«ãŒããæé«ïŒ3ã«ãŒãããã21.3ç§
æåãããã¡ã€ãªã³ã°ã¯ãã€é©çšã§ããŸããïŒ ãŸããããã¯éçºè
éã§ããŸããŸãªçš®é¡ã®ç«¶äºãè¡ãã®ã«æé©ãªæ¹æ³ã§ãïŒãç§ã®ã³ãŒãã¯ããªãã®ãã®ãããéããªã£ãã®ã§ãç§ã¯
åªããããã°ã©ããŒã§ãïŒãïŒããããŠããã¯è¯ãããšã§ãã 第äºã«ãããã°ã©ã ã®é床ã決å®ããããã«ãç®ã§ãå¿
èŠãªå ŽåïŒ20ç§ïŒé·ãïŒïŒãŸãã¯æ¹åã®çµæãååŸããïŒã³ãŒãã100åé«éåããïŒïŒã
ããããæãéèŠãªã¢ããªã±ãŒã·ã§ã³ã¯ãã³ãŒãã®å®è¡æã®çµ±èšæ
å ±ãå®çšŒåç°å¢ã§ã»ãŒãªã¢ã«ã¿ã€ã ã§åéããããšã§ãã ãããè¡ãã«ã¯ãã¡ããªãã¯ãåéããŠã°ã©ããæç»ããããã«ã枬å®ãããæéãä»»æã®ã·ã¹ãã ã«éä¿¡ããŸãïŒ
Graphiteãš
StatsDã
ã°ã©ãã¡ã€ãã® ã¢ã°ãªã²ãŒã¿ãŒãšããŠäœ¿çšããã®ã
倧奜ãã§ãïŒã
ãããè¡ãã«ã¯ãåçŽãªã³ã³ããã¹ããããŒãžã£ãŒã䜿çšã§ããŸãã
"""Collect profiling statistic into graphite""" import socket import time CARBON_SERVER = '127.0.0.1' CARBON_PORT = 2003 class Stats(object): """Context manager for send stats to graphite""" def __init__(self, name): self.name = name def __enter__(self): self.start = time.time() return self def __exit__(self, *args): duration = (time.time() - self.start) * 1000
ãã®äœ¿çšäŸïŒ
from python_profiling.context_managers import Stats ... with Stats('project.application.some_action'): do_some_action()
ãŸãã¯ãã·ã³ãã«ãªãã³ã¬ãŒã¿ïŒ
"""Collect profiling statistic into graphite""" import socket import time CARBON_SERVER = '127.0.0.1' CARBON_PORT = 2003 def stats(name): """Decorator for send stats to graphite""" def _timing(func): def _wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) duration = (time.time() - start) * 1000
ãã³ã¬ãŒã¿ã®äœ¿çšäŸïŒ
from python_profiling.decorators import stats ... @stats('project.application.some_action') def do_some_action(): """Doing some useful action"""
åºåã§ã¯ãããšãã°æ¬¡ã®ããã«ãèå³ã®ããã³ãŒãã»ã¯ã·ã§ã³ã®ã©ã³ã¿ã€ã ã°ã©ããååŸããŸãã

ããã¯ãã³ãŒããã©ã€ããµãŒããŒã§ã©ã®ããã«æããããããåžžã«ç€ºããæé©åãããšããæ¥ãŸããã 次ã®ãªãªãŒã¹åŸã«ã³ãŒããã©ã®ããã«æããããããèŠãããšãã§ããŸãã ãªãã¡ã¯ã¿ãªã³ã°ãŸãã¯æé©åãå®è¡ãããå Žåãã¹ã±ãžã¥ãŒã«ã䜿çšãããšãçµæãã¿ã€ã ãªãŒã«è©äŸ¡ããç¶æ³å
šäœãæ¹åãŸãã¯æªåãããã©ãããç解ã§ããŸãã
ãã®æ¹æ³ã«ã¯æ¬ ç¹ããããæãéèŠãªã®ã¯å
¥åããŒã¿ãžã®äŸåæ§ã®æ¬ åŠã§ãã ãããã£ãŠãçŽ æ°ãis_primeãã決å®ããããã®é¢æ°ã§ã¯ãå®è¡æéã¯ãã®æ°ã®å€ã«åŒ·ãäŸåãããã®é¢æ°ããããžã§ã¯ãã§é »ç¹ã«åŒã³åºããããšãã¹ã±ãžã¥ãŒã«ã¯å®å
šã«ç¡æå³ã«ãªããŸãã ã©ã®ã¢ãããŒãã䜿çšã§ããã®ãããããŠã©ã®ãããªã¢ãããŒããæ¡çšããŠããã®ããæ確ã«ç解ããããšãéèŠã§ãã
ãã¡ãããããã°ã©ã ã®çµ±èšãåéãããããã°ã©ãã¡ã€ãã®ã¡ããªãã¯ã®åéãéããŠãããã¡ã€ãªã³ã°ã¡ãœãããåŒã³åºãããšãã§ããŸãã ããããæåã®éšåã§æ¡çšããçšèªãéµå®ããããšãææ¡ããŸãããçµ±èšçããããã¡ã€ãªã³ã°ãšã¯ãç¹å®ã®ééã§ã®æ
å ±ã®åéïŒãµã³ããªã³ã°ïŒãæå³ããŸãããžã£ã³ãŽstatsd
ã°ã©ãã¡ã€ããšãã®ããã®éçŽãµãŒããŒïŒ
StatsD ïŒã䜿çšããå Žåã1ã€ã®ã¡ããªãã¯ã«å¯ŸããŠãè€æ°ã®ã°ã©ããäžåºŠã«ååŸããŸãïŒæå°ããã³æ倧ã³ãŒãå®è¡æéãããã³åäœæéãããã®èšé²ãããèªã¿åãå€ïŒé¢æ°åŒã³åºãïŒã®äžå€®å€ãšæ°ãããã¯éåžžã«äŸ¿å©ã§ãã StatsDãDjangoã«æ¥ç¶ããã®ãã©ãã»ã©ç°¡åãèŠãŠã¿ãŸãããã
ã¢ãžã¥ãŒã«ãé
眮ããŸãã
âpip install django-statsd-mozilla
settings.pyã«èšå®ãè¿œå ããŸãïŒã¢ããªã±ãŒã·ã§ã³ãšããã«ãŠã§ã¢ïŒ
INSTALLED_APPS += ('django_statsd',) MIDDLEWARE_CLASSES += ( 'django_statsd.middleware.GraphiteRequestTimingMiddleware', 'django_statsd.middleware.GraphiteMiddleware', )
ããã ãã§ãïŒ åºåã§ã¯ã次ã®ã°ã©ããååŸããŸãã

StatsDã®é·æãšçæïŒ
+ã€ã³ã¹ããŒã«ãšäœ¿çšãç°¡å
+çç£ã«é©ããŠããŸãïŒäžè¬çã«å¿
é ïŒ
-å°ãã®æ
å ±ïŒé/æéïŒ
-ã°ã©ãã¡ã€ããšstatsdãå¿
èŠïŒå¿
é ïŒ
çµ±èšãããã¡ã€ã©ãŒ
ã€ãã³ããããã¡ã€ã©ãŒãšã¯ç°ãªããçµ±èšãããã¡ã€ãªã³ã°çšã®ããŒã«ã¯ã»ãšãã©ãããŸããã 次ã®3ã€ã«ã€ããŠã話ããŸãã
ã¹ã¿ããããã
ãããããPythonã§æãæåãªçµ±èšãããã¡ã€ã©ãŒã¯
statprofã§ãã ç§ãã¡ã¯çœ®ããŸãïŒ
âpip install statprof
ããšãã°ã䜿çšããŸãã ãã®ããã«ïŒ
import statprof ... statprof.start() try: do_some_action() finally: statprof.stop() statprof.display()
ãŸãã¯ã³ã³ããã¹ããããŒãžã£ãŒãšããŠïŒpypiã®ããŒãžã§ã³0.1.2ã§ã¯ãªãã
ãªããžããªã®ããŒãžã§ã³ã§ã®ã¿ïŒïŒ
import statprof ... with statprof.profile(): do_some_action()
ã³ãŒãã®ãããã¡ã€ã«ãäœæããŠã¿ãŸãããã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 600851475143
环ç©èªå·±æ¯ç
æéç§ç§åå
44.42 8.63 8.63 euler_3.py:12:is_prime
37.12 7.21 7.21 euler_3.py:11:is_prime
16.90 19.40 3.28 euler_3.py:21:find_prime_factors
0.95 0.18 0.18 euler_3.py:9:is_prime
0.48 0.09 0.09 euler_3.py:13:is_prime
0.06 0.01 0.01 euler_3.py:14:is_prime
0.06 0.01 0.01 euler_3.py:20:find_prime_factors
0.03 0.01 0.01 euler_3.py:23:find_prime_factors
0.00 19.42 0.00 euler_3.py:37ïŒ<ã¢ãžã¥ãŒã«>
-ãµã³ãã«æ°ïŒ3575
åèšæéïŒ19.420000ç§
åçïŒ6857
ããã°ã©ã ã«ã¯2ã€ã®ãããã¹ãããããããŸãã æåïŒis_primeé¢æ°ã®12è¡ç®ãš11è¡ïŒè«ççïŒããããã®å®è¡ã«ã¯ããã°ã©ã ã®æéã®çŽ82ïŒ
ããããã2çªç®ïŒfind_prime_factorsé¢æ°ã®21è¡ç®ïŒçŽ17ïŒ
ã®æéïŒïŒ
if is_prime(i) and not num % i:
is_primeããã°ã©ã ã®æãããããªé¢æ°ãåŒã³åºãããã®ã¯ããã®è¡ããã§ãã æ¡ä»¶ã®ãªãã©ã³ããå€æŽããã ãã§ãããã°ã©ã ã倧å¹
ã«é«éåã§ããŸãã é€ç®ã®äœãïŒnumïŒ
iïŒãååŸããæäœã¯ãé¢æ°ãis_primeããããé«éã§ããåæã«ãããæ°å€ãå¥ã®æ°å€ã§é€ç®ãããšãã®äœãããŒãã§ã¯ãªãããnot numïŒ
iãã¯Falseãè¿ããŸãã ãããã£ãŠãis_primeé¢æ°ã®åŒã³åºãåæ°ã倧å¹
ã«åæžããŸãã
if not num % i and is_prime(i):
ãããã¡ã€ãªã³ã°ãéå§ããŸãã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython euler_3.py 600851475143
环ç©èªå·±æ¯ç
æéç§ç§åå
87.50 0.22 0.22 euler_3.py:21:find_prime_factors
5.00 0.01 0.01 euler_3.py:20:find_prime_factors
5.00 0.01 0.01 euler_3.py:11:is_prime
2.50 0.01 0.01 euler_3.py:23:find_prime_factors
0.00 0.25 0.00 euler_3.py:37ïŒ<ã¢ãžã¥ãŒã«>
-ãµã³ãã«æ°ïŒ40
åèšæéïŒ0.250000ç§
åçïŒ6857
ããã°ã©ã ã®æãããããªå Žæã¯ãé¢æ°ãfind_prime_factorsãã®21è¡ç®ã§ããã€ãŸããé€ç®ã®æ®ããååŸããæäœïŒãnumïŒ
iãïŒã§ãã é¢æ°ãis_primeãã®åŒã³åºãé »åºŠã¯ã¯ããã«äœããªããããã°ã©ã ã®å®è¡æéã®5ïŒ
ã«ãªããŸããã ããã°ã©ã ã®å®è¡æéã¯å€§å¹
ã«ççž®ãããçªå·600851475143ã®æ倧åçŽé€æ°ã¯ããã0.25ç§ã§èŠã€ãããŸããïŒããã°ã©ã ãçŽ80åå éããŸããïŒã
ãããã¡ã€ã©ãŒæäœã®ç²ŸåºŠãã©ãã ãäœäžãããã«æ³šç®ããŸãããïŒ3575ãµã³ãã«ïŒæé©ååã®äŸïŒã§ã¯ãªãã40ã®æž¬å®ã®ã¿ãè¡ããã5è¡ã®ã¿ã§æ
å ±ãåä¿¡ãããŸããã ãã¡ãããããã§ã¯ååã§ã¯ãããŸããã å®éãããã¯çµ±èšãããã¡ã€ã©ãŒã®æ©èœã§ããããŒã¿ãåéããæéãé·ããªãã°ãªãã»ã©ãåæã¯ããæ£ç¢ºã«ãªããŸãã ããšãã°ãããã°ã©ã ã10ã100åå®è¡ããå Žåãããæ£ç¢ºãªçµæãåŸãããŸãã
ããã§å°ãäœè«ãããªããã°ãªããŸããããããã¡ã€ã©ãŒãã³ãŒã
ã«ãã¬ããžåæããŒã«ãªã©ã®ãã¹ãŠã®è£å©ãŠãŒãã£ãªãã£ã®99ïŒ
ã¯ãæ
å ±ã®æå°åäœãšããŠæååãåŠçããŸãã ãããã£ãŠãããšãã°æ¬¡ã®ããã«ãã§ããã ãã³ã³ãã¯ãã«ã³ãŒããèšè¿°ããããšãããšã
result = foo() if bar else baz()
ãããã¡ã€ã©ãŒã§ã¯ãã©ã®é¢æ°ãåŒã³åºãããã©ã®é¢æ°ãåŒã³åºãããªãã£ããã確èªã§ããŸããã ã«ãã¬ããžã¬ããŒãã§ã¯ããã®ã·ããªãªãŸãã¯ãã®ã·ããªãªããã¹ãã§ã«ããŒãããŠãããã©ããã¯ããããŸããã ãã芪ãã¿ããããäžèŠäŸ¿å©ãªã³ãŒãã«ãé¢ããããå Žåã«ãã£ãŠã¯æ¬¡ã®ããã«èšè¿°ããæ¹ãé©åã§ãã
if bar: result = foo() else: result = baz()
ãããŠãããã«ã©ã®è¡ãå®è¡ãããªãããã©ã®è¡ãå®è¡ããããïŒããã³é »åºŠïŒã確èªããŸãã ãã¡ãããåäžè¡ãšã³ã³ãã¯ããã¯åªããŠããŠæ¥œããã§ãããå Žåã«ãã£ãŠã¯ãããå€ãã®æéãè²»ãããŠããããã¡ã€ã«ããã¹ããããã³ä¿å®ã容æãªã³ãŒããååŸããæ¹ãè¯ãããšããããŸãã
statprofã®é·æãšçæïŒ
+æå°éã®ãªãŒããŒããã
+䜿ãããã
-å®è£
ã¯éåžžã«ç²éã§å®éšçã§ã
-é©åãªçµæãåŸãã«ã¯ãé·ãåæãå¿
èŠã§ã
-ããŒã¿åºåãå°ãªã
Django-live-profiler
泚ç®ã«å€ããå¥ã®ãã€ã³ãã¯ã
django-live-profiler -statprofã䜿çšããDjangoã¢ããªã±ãŒã·ã§ã³ãããã¡ã€ã©ãŒã§ãã åäœãããã«ã¯ããŸã
zeromqãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
brew brew install zmq
ã¢ãžã¥ãŒã«èªäœãé
眮ããŸãã
âpip install django-live-profiler
ãããŠãã¢ã°ãªã²ãŒã¿ãŒãå®è¡ããŸãïŒ
âéçŽ--host 127.0.0.1 --port 5556
次ã«ãsettings.pyã«ãããã¡ã€ã©ãŒãè¿œå ããŸãã
ãããŠurls.pyã§ïŒ
url(r'^profiler/', include('profiler.urls'))
ãµãŒããŒãèµ·åããŸãã
âpython manage.py runserver --noreload --nothreading
ãã©ãŠã¶ã§ãããã¡ã€ã©ãŒãéããŸãïŒ
127.0.0.1 ïŒ8000 / profiler /ãªã¢ã«ã¿ã€ã ã§ã©ã€ããããžã§ã¯ãã®ãããã¡ã€ãªã³ã°ã®çµæã芳å¯ããããšã§äººçã楜ãã¿ãŸãïŒ

ãŸããdjango-live-profilerã¯SQLã¯ãšãªã衚瀺ã§ããŸãã

django-live-profilerã®é·æãšçæïŒ
+å°ããªãªãŒããŒããã
+æ¬çªç°å¢ã«é
眮ã§ããŸãïŒéåžžã«æ
éã«ïŒ
+ SQLã¯ãšãªãããã¡ã€ãªã³ã°
-è€éãªã€ã³ã¹ããŒã«ãäŸåé¢ä¿
-ããŒã¿åºåãå°ãªã
ãããã
ãã1ã€ã®çµ±èšãããã¡ã€ã©ãŒã¯
plop ïŒPython Low-Overhead ProfilerïŒãšåŒã°ããŸãã èè
ã¯ãå®è£
ãç²éã§ããããããžã§ã¯ãã掻çºã«éçºäžã§ããããšãçŽã¡ã«èŠåããŸãã ã€ã³ã¹ããŒã«ã¯ç°¡åã§ãïŒ
âpip install plop tornado
ãããã¡ã€ãªã³ã°ãéå§ããŸãã
rudnyh @ work ïŒã/ work / python-profilingïŒvenvïŒ python-profiling ïŒ
âpython -m plop.collector euler_3.py 600851475143
åçïŒ6857
/tmp/plop.outã«ä¿åããããããã¡ã€ã«åºå
ãªãŒããŒãããã¯ãµã³ãã«ããã5.89810884916e-05ïŒ0.00589810884916ïŒ
ïŒã§ãã
ãµãŒããŒãèµ·åããŠçµæã衚瀺ããŸãã
âpython -m plop.viewer --datadir = / tmp /
ãã©ãŠã¶ã§
httpïŒ// localhostïŒ8888 /ããŒãžãéããçµæã楜ããã§ãã ããïŒ

Plopã¯Djangoã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ã«ã«äœ¿çšã§ããŸãã ãããè¡ãã«ã¯ãdjango-plopããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
âpip install django-plop
ãããã¡ã€ã©ãŒã«çµæãé
眮ããå Žæãæ瀺ãããã©ã¡ãŒã¿ãŒãsettings.pyããã«ãŠã§ã¢ã«è¿œå ããŸãã
MIDDLEWARE_CLASSES += ( 'django-plop.middleware.PlopMiddleware', ) PLOP_DIR = os.path.join(PROJECT_ROOT, 'plop')
倧èŠæš¡ãªãããžã§ã¯ãã§ã¯ãã°ã©ãã¯ããå°è±¡çã«èŠããŸãã

åçã¯éåžžã«ãµã€ã±ããªãã¯ã§ãããæ¬æ Œçãªãããã¡ã€ãªã³ã°ããŒã«ãšåŒã¶ããšã¯å°é£ã§ãããã³ãŒã«ã°ã©ããããã«ãããããããã³ãŒãã®æãããããªã»ã¯ã·ã§ã³ã衚瀺ããããªãŒããŒãããã¯æå°éïŒèè
ã«ãããš2ïŒ
ã®ã¿ïŒãå Žåã«ãã£ãŠã¯ãã®ããŒã«ã§ã»ã¯ã·ã§ã³ãæ€åºããã®ã«ååã§ããããã¡ã€ãªã³ã°ãå¿
èŠãªã³ãŒãã
DropboxãµãŒãã¹ã¯æ¬çªç°å¢ã§çŽæ¥plopã䜿çšããŸãã
plopã®é·æãšçæïŒ
+æå°éã®ãªãŒããŒããã
+çç£ã«æå
¥å¯èœ
-è€éãªã€ã³ã¹ããŒã«ãäŸåé¢ä¿
-éåžžã«å°ãªãåºå
æ°ããéºç©
çµ±èšãããã¡ã€ã©ãŒã«ã€ããŠèšãã°ããããã¡ã€ãªã³ã°ã ãã§ãªãããµãŒããŒãšWebã¢ããªã±ãŒã·ã§ã³ïŒããã³ã¢ãã€ã«ããŒãžã§ã³ïŒã®ç£èŠãç®çãšãã
New RelicãµãŒãã¹ã«ã€ããŠãèšãããšãã§ããŸãã åžæãã人ã¯äŒç€Ÿã®ãŠã§ããµã€ãã§ãã¹ãŠã®æ
å ±ãèŠãããšãã§ããç¡æã§ãµãŒãã¹ãè©Šãããšãã§ããŸãã ç§ã¯å人çã«New Relicã§ã®äœæ¥ãè©Šã¿ãããšããªããããããã«ã€ããŠã¯èª¬æããŸããããŸããèªåã§è©Šãããã®ã«ã€ããŠã®ã¿è©±ãããšã«æ
£ããŠããŸãã ãããã¡ã€ã©
ããŒãžã§ã¹ã¯ãªãŒã³ã·ã§ããã衚瀺ã
ãŸã ã
é·æãšçæïŒ
+æ¬çªçš
+å€ãã®ç°ãªãæ©èœïŒãããã¡ã€ãªã³ã°ã ãã§ãªãïŒ
-ææïŒç¡æçããããŸãïŒ
-ããŒã¿ã¯ä»ã®äººã®ãµãŒããŒã«éä¿¡ãããŸã
次ã®èšäºã§ã¯
ã Pythonããããã¡ã€ã«ããããã®äž»èŠãªããŒã«ã§ããã€ãã³ããããã¡ã€ã©ãŒã®ç 究ã«é²ã¿ãŸãã é£çµ¡ãåãåããŸãããïŒ