Pythonã®ãããã¡ã€ãªã³ã°ããŒã«cProfileãšline_profilerã®è©³çŽ°ãªæ¯èŒãäœ¿çšæ³ãåææè¡ãPythonã³ãŒãã®ã°ããŒãã«ãªããã©ãŒãã³ã¹æé©åã®ããã®å®äŸã玹ä»ã
Pythonãããã¡ã€ãªã³ã°ããŒã«: cProfile vs line_profiler åæã«ããããã©ãŒãã³ã¹æé©å
ãœãããŠã§ã¢éçºãç¹ã«Pythonã®ãããªåçèšèªã䜿çšããéã«ã¯ãã³ãŒãã®ããã©ãŒãã³ã¹ãçè§£ããæé©åããããšãäžå¯æ¬ ã§ããã³ãŒãã®é床ãé
ããšããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžãã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã¹ãã®å¢å ãã¹ã±ãŒã©ããªãã£ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸããPythonã«ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ã®ç¹å®ã«åœ¹ç«ã€ãããã€ãã®åŒ·åãªãããã¡ã€ãªã³ã°ããŒã«ãçšæãããŠããŸãããã®èšäºã§ã¯ãæã人æ°ã®ãã2ã€ã®ããŒã«ãcProfileãšline_profilerã«ã€ããŠæãäžããŠãããŸãããããã®æ©èœãäœ¿çšæ³ãããã³Pythonã³ãŒãã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžãããããã®çµæã®è§£éæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãªãPythonã³ãŒãããããã¡ã€ãªã³ã°ããã®ãïŒ
ããŒã«ã«å ¥ãåã«ããªããããã¡ã€ãªã³ã°ãäžå¯æ¬ ãªã®ããçè§£ããŠãããŸããããå€ãã®å Žåãããã©ãŒãã³ã¹ã®ããã«ããã¯ãã©ãã«ããã®ããšããçŽæã¯èª€è§£ãæãå¯èœæ§ããããŸãããããã¡ã€ãªã³ã°ã¯å ·äœçãªããŒã¿ãæäŸããã³ãŒãã®ã©ã®éšåãæãå€ãã®æéãšãªãœãŒã¹ãæ¶è²»ããŠããããæ£ç¢ºã«ç€ºããŸãããã®ããŒã¿é§ååã®ã¢ãããŒãã«ãããæå€§ã®å¹æãåŸãããé åã«æé©åäœæ¥ãéäžãããããšãã§ããŸããè€éãªã¢ã«ãŽãªãºã ãäœæ¥ããããŠæé©åããããšããŠãå®éã®é床äœäžãéå¹çãªI/Oæäœã«ãããã®ã ã£ãããšã倿ãããšããŸãããããã¡ã€ãªã³ã°ã¯ããããã®ç¡é§ãªåªåãé²ãã®ã«åœ¹ç«ã¡ãŸãã
cProfileã®ç޹ä»: Pythonã®çµã¿èŸŒã¿ãããã¡ã€ã©ãŒ
cProfileã¯ã決å®è«çãããã¡ã€ã©ãŒãæäŸããPythonã®çµã¿èŸŒã¿ã¢ãžã¥ãŒã«ã§ããããã¯ãå颿°åŒã³åºãã«è²»ããããæéãšãå颿°ãåŒã³åºãããåæ°ãèšé²ããããšãæå³ããŸããCã§å®è£
ãããŠãããããcProfileã¯ãçŽç²ãªPythonçã§ããprofileãšæ¯èŒããŠãªãŒããŒããããäœããªã£ãŠããŸãã
cProfileã®äœ¿ç𿹿³
cProfileã®äœ¿çšã¯ç°¡åã§ããã³ãã³ãã©ã€ã³ããçŽæ¥ããŸãã¯Pythonã³ãŒãå
ã§ã¹ã¯ãªããããããã¡ã€ãªã³ã°ã§ããŸãã
ã³ãã³ãã©ã€ã³ããã®ãããã¡ã€ãªã³ã°
my_script.pyãšããååã®ã¹ã¯ãªããããããã¡ã€ãªã³ã°ããã«ã¯ã次ã®ã³ãã³ãã䜿çšã§ããŸãã
python -m cProfile -o output.prof my_script.py
ãã®ã³ãã³ãã¯ãPythonã«cProfileãããã¡ã€ã©ãŒã®äžã§my_script.pyãå®è¡ãããããã¡ã€ãªã³ã°ããŒã¿ãoutput.profãšããååã®ãã¡ã€ã«ã«ä¿åããããã«æç€ºããŸãã-oãªãã·ã§ã³ã¯åºåãã¡ã€ã«ãæå®ããŸãã
Pythonã³ãŒãå ã§ã®ãããã¡ã€ãªã³ã°
Pythonã¹ã¯ãªããå ã§ç¹å®ã®é¢æ°ãŸãã¯ã³ãŒããããã¯ããããã¡ã€ãªã³ã°ããããšãã§ããŸãã
import cProfile
def my_function():
# Your code here
pass
if __name__ == "__main__":
profiler = cProfile.Profile()
profiler.enable()
my_function()
profiler.disable()
profiler.dump_stats("my_function.prof")
ãã®ã³ãŒãã¯ãcProfile.Profileãªããžã§ã¯ããäœæããmy_function()ãåŒã³åºãåã«ãããã¡ã€ãªã³ã°ãæå¹ã«ãããã®åŸç¡å¹ã«ããŠããããã¡ã€ãªã³ã°çµ±èšãmy_function.profãšããååã®ãã¡ã€ã«ã«ãã³ãããŸãã
cProfileåºåã®åæ
cProfileã«ãã£ãŠçæããããããã¡ã€ãªã³ã°ããŒã¿ã¯ãçŽæ¥äººéãèªãããã®ã§ã¯ãããŸããããããåæããã«ã¯ãpstatsã¢ãžã¥ãŒã«ã䜿çšããå¿
èŠããããŸãã
import pstats
stats = pstats.Stats("output.prof")
stats.sort_stats("tottime").print_stats(10)
ãã®ã³ãŒãã¯ãoutput.profãããããã¡ã€ãªã³ã°ããŒã¿ãèªã¿åããå颿°ã«è²»ããããåèšæéïŒtottimeïŒã§çµæããœãŒãããäžäœ10åã®é¢æ°ãåºåããŸããä»ã®ãœãŒããªãã·ã§ã³ã«ã¯ããcumulativeãïŒçŽ¯ç©æéïŒãšãcallsãïŒåŒã³åºãåæ°ïŒããããŸãã
cProfileçµ±èšã®çè§£
pstats.print_stats()ã¡ãœããã¯ã次ã®ããŒã¿ãå«ãããã€ãã®åã衚瀺ããŸãã
ncalls: 颿°ãåŒã³åºãããåæ°ãtottime: 颿°èªäœã«è²»ããããåèšæéïŒãµã颿°ã«è²»ããããæéã¯é€ãïŒãpercall: 颿°èªäœã«è²»ããããå¹³åæéïŒtottime/ncallsïŒãcumtime: 颿°ãšãã®ãã¹ãŠã®ãµã颿°ã«è²»ããããçŽ¯ç©æéãpercall: 颿°ãšãã®ãµã颿°ã«è²»ããããå¹³åçŽ¯ç©æéïŒcumtime/ncallsïŒã
ãããã®çµ±èšãåæããããšã§ãé »ç¹ã«åŒã³åºããããããŸãã¯ããªãã®æéãæ¶è²»ãã颿°ãç¹å®ã§ããŸãããããã¯ãæé©åã®äž»ãªåè£ã§ãã
äŸ: cProfileã䜿çšããåçŽãªé¢æ°ã®æé©å
2ä¹ã®åèšãèšç®ãã颿°ã®ç°¡åãªäŸãèããŠã¿ãŸãããã
def sum_of_squares(n):
total = 0
for i in range(n):
total += i * i
return total
if __name__ == "__main__":
import cProfile
profiler = cProfile.Profile()
profiler.enable()
sum_of_squares(1000000)
profiler.disable()
profiler.dump_stats("sum_of_squares.prof")
import pstats
stats = pstats.Stats("sum_of_squares.prof")
stats.sort_stats("tottime").print_stats()
ãã®ã³ãŒããå®è¡ããŠsum_of_squares.profãã¡ã€ã«ãåæãããšãsum_of_squares颿°èªäœãå®è¡æéã®å€§éšåãæ¶è²»ããŠããããšãããããŸããå¯èœãªæé©åã¯ã次ã®ãããªããå¹ççãªã¢ã«ãŽãªãºã ã䜿çšããããšã§ãã
def sum_of_squares_optimized(n):
return n * (n - 1) * (2 * n - 1) // 6
æé©åãããããŒãžã§ã³ã®ãããã¡ã€ãªã³ã°ã¯ãããã©ãŒãã³ã¹ã®å€§å¹
ãªåäžã瀺ããŸããããã¯ãcProfileãæ¯èŒçåçŽãªã³ãŒãã§ãã£ãŠããæé©åã®é åãç¹å®ããã®ã«ã©ã®ããã«åœ¹ç«ã€ãã匷調ããŠããŸãã
line_profilerã®ç޹ä»: è¡ããšã®ããã©ãŒãã³ã¹åæ
cProfileã颿°ã¬ãã«ã®ãããã¡ã€ãªã³ã°ãæäŸããã®ã«å¯Ÿããline_profilerã¯ãã詳现ãªãã¥ãŒãæäŸãã颿°å
ã®åã³ãŒãè¡ã®å®è¡æéãåæã§ããŸããããã¯ãè€éãªé¢æ°å
ã®ç¹å®ã®ããã«ããã¯ãç¹å®ããäžã§éåžžã«è²Žéã§ããline_profilerã¯Pythonæšæºã©ã€ãã©ãªã®äžéšã§ã¯ãªããå¥éã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
pip install line_profiler
line_profilerã®äœ¿ç𿹿³
line_profilerã䜿çšããã«ã¯ããããã¡ã€ãªã³ã°ãã颿°ã@profileãã³ã¬ãŒã¿ã§è£
食ããå¿
èŠããããŸããæ³šïŒãã®ãã³ã¬ãŒã¿ã¯ãã¹ã¯ãªãããline_profilerã§å®è¡ããŠããå Žåã«ã®ã¿äœ¿çšå¯èœã§ãããéåžžã©ããå®è¡ãããšãšã©ãŒãçºçããŸãããŸããiPythonãŸãã¯Jupyter Notebookå
ã§line_profileræ¡åŒµæ©èœãããŒãããå¿
èŠããããŸãã
%load_ext line_profiler
次ã«ã%lprunããžãã¯ã³ãã³ãïŒiPythonãŸãã¯Jupyter Notebookå
ïŒãŸãã¯kernprof.pyã¹ã¯ãªããïŒã³ãã³ãã©ã€ã³ããïŒã䜿çšããŠãããã¡ã€ã©ãŒãå®è¡ã§ããŸãã
%lprunã䜿çšãããããã¡ã€ãªã³ã°ïŒiPython/JupyterïŒ
%lprunã®åºæ¬çãªæ§æã¯æ¬¡ã®ãšããã§ãã
%lprun -f function_name statement
ããã§ãfunction_nameã¯ãããã¡ã€ãªã³ã°ãã颿°ã§ãstatementã¯é¢æ°ãåŒã³åºãã³ãŒãã§ãã
kernprof.pyã䜿çšãããããã¡ã€ãªã³ã°ïŒã³ãã³ãã©ã€ã³ïŒ
ãŸãã@profileãã³ã¬ãŒã¿ãå«ããããã«ã¹ã¯ãªããã倿ŽããŸãã
@profile
def my_function():
# Your code here
pass
if __name__ == "__main__":
my_function()
次ã«ãkernprof.pyã䜿çšããŠã¹ã¯ãªãããå®è¡ããŸãã
kernprof -l my_script.py
ããã«ãããmy_script.py.lprofãšããååã®ãã¡ã€ã«ãäœæãããŸããçµæã衚瀺ããã«ã¯ãline_profilerã¹ã¯ãªããã䜿çšããŸãã
python -m line_profiler my_script.py.lprof
line_profileråºåã®åæ
line_profilerããã®åºåã¯ããããã¡ã€ãªã³ã°ããã颿°å
ã®åã³ãŒãè¡ã®å®è¡æéã®è©³çްãªå
èš³ãæäŸããŸããåºåã«ã¯ã次ã®åãå«ãŸããŠããŸãã
Line #: ãœãŒã¹ã³ãŒãã®è¡çªå·ãHits: è¡ãå®è¡ãããåæ°ãTime: è¡ã«è²»ããããåèšæéïŒãã€ã¯ãç§åäœïŒãPer Hit: è¡ããšã®å¹³åæéïŒãã€ã¯ãç§åäœïŒã% Time: 颿°ã«è²»ããããåèšæéã®ãã¡ãè¡ã«è²»ããããæéã®å²åãLine Contents: å®éã®ã³ãŒãè¡ã
% Timeåã調ã¹ãããšã§ãæãæéãæ¶è²»ããŠããã³ãŒãè¡ããã°ããç¹å®ã§ããŸãããããã¯ãæé©åã®äž»èŠãªã¿ãŒã²ããã§ãã
äŸ: line_profilerã䜿çšãããã¹ããããã«ãŒãã®æé©å
次ã®ãã¹ããããã«ãŒããå®è¡ãã颿°ãèããŠã¿ãŸãããã
@profile
def nested_loop(n):
result = 0
for i in range(n):
for j in range(n):
result += i * j
return result
if __name__ == "__main__":
nested_loop(1000)
ãã®ã³ãŒããline_profilerã§å®è¡ãããšãresult += i * jè¡ãå®è¡æéã®å€§éšåãæ¶è²»ããããšãããããŸããèããããæé©åã¯ãããå¹ççãªã¢ã«ãŽãªãºã ã䜿çšããããNumPyã®ãããªã©ã€ãã©ãªã䜿çšãããã¯ãã«åãªã©ã®ææ³ãæ€èšããããšã§ããããšãã°ãã«ãŒãå
šäœãNumPyã䜿çšããåäžè¡ã®ã³ãŒãã«çœ®ãæããããšã§ãããã©ãŒãã³ã¹ãåçã«åäžãããããšãã§ããŸãã
ã³ãã³ãã©ã€ã³ããkernprof.pyã䜿çšããŠãããã¡ã€ãªã³ã°ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- äžèšã®ã³ãŒãããã¡ã€ã«ïŒäŸïŒ
nested_loop.pyïŒã«ä¿åããŸãã kernprof -l nested_loop.pyãå®è¡ããŸãpython -m line_profiler nested_loop.py.lprofãå®è¡ããŸã
ãŸãã¯ãjupyter notebookã§:
%load_ext line_profiler
@profile
def nested_loop(n):
result = 0
for i in range(n):
for j in range(n):
result += i * j
return result
%lprun -f nested_loop nested_loop(1000)
cProfile vs. line_profiler: æ¯èŒ
cProfileãšline_profilerã®äž¡æ¹ãããã©ãŒãã³ã¹æé©åã«åœ¹ç«ã€ããŒã«ã§ãããããããç°ãªãé·æãšçæããããŸãã
cProfile
- é·æ:
- Pythonã«çµã¿èŸŒãŸããŠããŸãã
- ãªãŒããŒããããäœãã
- 颿°ã¬ãã«ã®çµ±èšãæäŸããŸãã
- çæ:
line_profilerã»ã©è©³çްã§ã¯ãããŸããã- 颿°å ã®ããã«ããã¯ãããã»ã©ç°¡åã«ç¹å®ã§ããŸããã
line_profiler
- é·æ:
- è¡ããšã®ããã©ãŒãã³ã¹åæãæäŸããŸãã
- 颿°å ã®ããã«ããã¯ã®ç¹å®ã«åªããŠããŸãã
- çæ:
- å¥éã€ã³ã¹ããŒã«ãå¿ èŠã§ãã
cProfileããããªãŒããŒããããé«ããªããŸãã- ã³ãŒãã®å€æŽãå¿
èŠïŒ
@profileãã³ã¬ãŒã¿ïŒã
åããŒã«ã®äœ¿çšææ
- cProfileã䜿çšããå Žå:
- ã³ãŒãã®ããã©ãŒãã³ã¹ã®æŠèŠããã°ããææ¡ããå¿ èŠãããå Žåã
- æãæéã®ããã颿°ãç¹å®ããå Žåã
- 軜éãªãããã¡ã€ãªã³ã°ãœãªã¥ãŒã·ã§ã³ãæ¢ããŠããå Žåã
- line_profilerã䜿çšããå Žå:
cProfileã§äœéãªé¢æ°ãç¹å®ããå Žåã- ããã«ããã¯ã®åå ãšãªã£ãŠããç¹å®ã®ã³ãŒãè¡ãç¹å®ããå¿ èŠãããå Žåã
@profileãã³ã¬ãŒã¿ã§ã³ãŒãã倿ŽããŠãæ§ããªãå Žåã
é«åºŠãªãããã¡ã€ãªã³ã°ææ³
åºæ¬ãè¶ ããŠããããã¡ã€ãªã³ã°äœæ¥ã匷åããããã«äœ¿çšã§ããããã€ãã®é«åºŠãªææ³ããããŸãã
æ¬çªç°å¢ã§ã®ãããã¡ã€ãªã³ã°
éçºç°å¢ã§ã®ãããã¡ã€ãªã³ã°ã¯éèŠã§ãããæ¬çªç°å¢ã®ãããªç°å¢ã§ã®ãããã¡ã€ãªã³ã°ã¯ãéçºäžã«æããã«ãªããªãããã©ãŒãã³ã¹ã®åé¡ãæããã«ããããšãã§ããŸãããã ããæ¬çªç°å¢ã§ãããã¡ã€ãªã³ã°ãè¡ãå Žåã¯ããªãŒããŒããããããã©ãŒãã³ã¹ã«åœ±é¿ãäžãããµãŒãã¹ãäžæããå¯èœæ§ããããããæ³šæãå¿ èŠã§ãã鿬 çã«ããŒã¿ãåéãããµã³ããªã³ã°ãããã¡ã€ã©ãŒã䜿çšããããšãæ€èšããæ¬çªã·ã¹ãã ãžã®åœ±é¿ãæå°éã«æããŠãã ããã
çµ±èšãããã¡ã€ã©ãŒã®äœ¿çš
py-spyãªã©ã®çµ±èšãããã¡ã€ã©ãŒã¯ãcProfileãªã©ã®æ±ºå®è«çãããã¡ã€ã©ãŒã®ä»£æ¿ææ®µã§ãããããã¯ãäžå®ã®ééã§ã³ãŒã«ã¹ã¿ãã¯ããµã³ããªã³ã°ããããšã«ãããå颿°ã«è²»ããããæéã®èŠç©ãããæäŸããŸããçµ±èšãããã¡ã€ã©ãŒã¯éåžžãæ±ºå®è«çãããã¡ã€ã©ãŒããããªãŒããŒããããäœããæ¬çªç°å¢ã§ã®äœ¿çšã«é©ããŠããŸããå€éšãµãŒãã¹ãã©ã€ãã©ãªãšã®ããåããªã©ãã·ã¹ãã å
šäœã®ããã©ãŒãã³ã¹ãçè§£ããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
ãããã¡ã€ãªã³ã°ããŒã¿ã®èŠèŠå
SnakeVizãgprof2dotãªã©ã®ããŒã«ã¯ããããã¡ã€ãªã³ã°ããŒã¿ã®èŠèŠåã«åœ¹ç«ã¡ãè€éãªã³ãŒã«ã°ã©ããçè§£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããšã容æã«ãªããŸããSnakeVizã¯cProfileåºåãèŠèŠåããã®ã«ç¹ã«åœ¹ç«ã¡ãgprof2dotã¯cProfileãå«ãããŸããŸãªãœãŒã¹ããã®ãããã¡ã€ãªã³ã°ããŒã¿ãèŠèŠåããããã«äœ¿çšã§ããŸãã
å®äŸ: ã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«å±éã®ããã«Pythonã³ãŒããæé©åããå Žåãæ¬¡ã®ãããªããã€ãã®èŠå ãèæ ®ããããšãéèŠã§ãã
- ãããã¯ãŒã¯ã¬ã€ãã³ã·: ãããã¯ãŒã¯éä¿¡ã«å€§ããäŸåããã¢ããªã±ãŒã·ã§ã³ã¯ãã¬ã€ãã³ã·ãåå ã§ããã©ãŒãã³ã¹ã®ããã«ããã¯ãçºçããå¯èœæ§ããããŸãããããã¯ãŒã¯ãªã¯ãšã¹ãã®æé©åããã£ãã·ã³ã°ã®äœ¿çšãã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ïŒCDNïŒãªã©ã®æè¡ã䜿çšãããšããããã®åé¡ã軜æžã§ããŸããããšãã°ãäžçäžã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã¢ãã€ã«ã¢ããªã¯ããŠãŒã¶ãŒã«è¿ãå Žæã«é 眮ããããµãŒããŒããéçã¢ã»ãããé ä¿¡ããããã«CDNã䜿çšããããšã§ã¡ãªãããåŸãå¯èœæ§ããããŸãã
- ããŒã¿ã®ããŒã«ãªãã£: ããŒã¿ããããå¿ èŠãšãããŠãŒã¶ãŒã®è¿ãã«ä¿åãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããå°ççã«åæ£ããããŒã¿ããŒã¹ã䜿çšããããå°åããŒã¿ã»ã³ã¿ãŒã§ããŒã¿ããã£ãã·ã¥ããããšãæ€èšããŠãã ãããã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ã¯ãããŸããŸãªãªãŒãžã§ã³ã«ãªãŒãã¬ããªã«ãæã€ããŒã¿ããŒã¹ã䜿çšããŠã補åã«ã¿ãã°ã®ã¯ãšãªã®ã¬ã€ãã³ã·ãæžããããšãã§ããŸãã
- æåãšã³ã³ãŒãã£ã³ã°: è€æ°ã®èšèªã§ããã¹ãããŒã¿ãæ±ãå Žåã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ã®ãããšã³ã³ãŒãã£ã³ã°ãšãã³ãŒãã£ã³ã°ã®åé¡ãåé¿ããããã«ãUTF-8ãªã©ã®äžè²«æ§ã®ããæåãšã³ã³ãŒãã£ã³ã°ã䜿çšããããšãäžå¯æ¬ ã§ããè€æ°ã®èšèªããµããŒããããœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ã¯ã衚瀺ãšã©ãŒãšããã©ãŒãã³ã¹ã®ããã«ããã¯ãé²ãããã«ããã¹ãŠã®ããã¹ãããŒã¿ãUTF-8ã䜿çšããŠä¿åããã³åŠçãããããšãä¿èšŒããå¿ èŠããããŸãã
- ã¿ã€ã ãŸãŒã³ãšããŒã«ã©ã€ãŒãŒã·ã§ã³: ã¿ã€ã ãŸãŒã³ãšããŒã«ã©ã€ãŒãŒã·ã§ã³ãæ£ããåŠçããããšã¯ãåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ãã
pytzã®ãããªã©ã€ãã©ãªã䜿çšãããšãã¿ã€ã ãŸãŒã³ã®å€æãç°¡çŽ åããããŸããŸãªå°åã®ãŠãŒã¶ãŒã«æ¥ä»ãšæå»æ å ±ãæ£ãã衚瀺ãããããã«ããããšãã§ããŸããåœéçãªæ è¡äºçŽãŠã§ããµã€ãã¯ããã©ã€ãæéããŠãŒã¶ãŒã®ããŒã«ã«ã¿ã€ã ãŸãŒã³ã«æ£ç¢ºã«å€æããŠæ··ä¹±ãé¿ããå¿ èŠããããŸãã
çµè«
ãããã¡ã€ãªã³ã°ã¯ããœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ã®äžå¯æ¬ ãªéšåã§ããcProfileãline_profilerãªã©ã®ããŒã«ã䜿çšããããšã§ãã³ãŒãã®ããã©ãŒãã³ã¹ã«é¢ãã貎éãªæŽå¯ãåŸãŠãæé©åã®é åãç¹å®ã§ããŸããæé©åã¯å埩çãªããã»ã¹ã§ããããšãå¿ããªãã§ãã ããããŸããã³ãŒãããããã¡ã€ãªã³ã°ããããã«ããã¯ãç¹å®ããæé©åãé©çšããŠããã倿Žã®åœ±é¿ã枬å®ããããã«åãããã¡ã€ãªã³ã°ããŸãããã®ãããã¡ã€ãªã³ã°ãšæé©åã®ãµã€ã¯ã«ã«ãããã³ãŒãã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžããããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšããå¹ççãªãªãœãŒã¹å©çšãå®çŸããŸãããããã¯ãŒã¯ã¬ã€ãã³ã·ãããŒã¿ã®ããŒã«ãªãã£ãæåãšã³ã³ãŒãã£ã³ã°ãã¿ã€ã ãŸãŒã³ãªã©ã®ã°ããŒãã«ãªèŠå ãèæ
®ããããšã§ãPythonã¢ããªã±ãŒã·ã§ã³ãäžçäžã®ãŠãŒã¶ãŒã«å¯ŸããŠé©åã«æ©èœããããã«ããããšãã§ããŸãã
ãããã¡ã€ãªã³ã°ã®åãæŽ»çšããŠãPythonã³ãŒããããé«éã«ãããå¹ççã«ãããã¹ã±ãŒã©ãã«ã«ããŸãããã