Community

๐Ÿ“ˆ ๐Ÿ“‰ Python ์„ฑ๋Šฅํ…Œ์ŠคํŠธ (cProfile, TimeIt)

์˜ค๋Š˜์€ Python Performance Test๐Ÿ“‰๐Ÿ“ˆ ์— ๋Œ€ํ•ด ์–˜๊ธฐ๋ฅผ ํ•ด๋ณผ๊นŒํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋Š” ๋ถ€ํ•˜์ƒํ™ฉ์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด ์„œ๋น„์Šค์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ , ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋„์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค JAVA์—์„œ๋Š” nGrinder, Jmeter๋“ฑ์„ ํ†ตํ•ด์„œ ์„ฑ๋Šฅ์„ ์ธก์ •ํ• ์ˆ˜ ์žˆ๋Š”๊ฑด ์ด๋ฏธ ์œ ๋ช…ํ•˜์ฃ . ํŒŒ์ด์ฌ๋„ ์ด๋Ÿฐ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ํ• ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ๊ฐ€์ง€๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”. ์˜ค๋Š˜์€ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ์— ์œ ์šฉํ•œ cProfile๊ณผ Timelt์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ“ cProfile (https://docs.python.org/3/library/profile.html) cProfile์€ ์ด๋ฆ„์—์„œ ์•Œ์ˆ˜ ์žˆ๋“ฏ์ด ํ”„๋กœํŒŒ์ผ๋ง์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด์„œ, ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ, ๋ฐ˜ํ™˜, ์˜ˆ์™ธ๋ฅผ ์ถ”์ ํ•˜๊ณ , ๊ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์ด๋ฒคํŠธ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์€ ํ‘œ์ค€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ cProfile, profile์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ์ƒ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ๊ตฌ๊ฐ„์ด ์–ด๋””์ธ์ง€ ํ™•์ธ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (* ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ ์ฐธ์กฐ, ํด๋ฆญํ•˜์—ฌ ์›๋ณธ์ด๋ฏธ์ง€๋กœ ๋ณด๋Š”๊ฒŒ ํŽธํ•ฉ๋‹ˆ๋‹ค.) โ–ถ๏ธ ncalls : ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์ˆ˜ โ–ถ๏ธ tottime : ํ•ด๋‹น ํ•จ์ˆ˜ ์‹คํ–‰์— ์‚ฌ์šฉ๋œ ์ „์ฒด ์‹œ๊ฐ„ ((์„œ๋ธŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋“  ์‹œ๊ฐ„์€ ์ œ์™ธ) โ–ถ๏ธ tottime percall : tottime์„ ncalls๋กœ ๋‚˜๋ˆˆ ๊ฐ’ โ–ถ๏ธcumtime : ์ด ํ•จ์ˆ˜์™€ ๋ชจ๋“  ์„œ๋ธŒ ํ•จ์ˆ˜์—์„œ ์†Œ์š”๋œ ๋ˆ„์  ์‹œ๊ฐ„ (ํ˜ธ์ถœ์—์„œ ์ข…๋ฃŒ๊นŒ์ง€). โ–ถ๏ธ cumtime percall : cumtime์˜ percall(cumtime/number) โ–ถ๏ธ filename:lineno(functon) : ํŒŒ์ผ๋ช…:์ค„ ๋ฒˆํ˜ธ(ํ•จ์ˆ˜) ๐Ÿ“ TimeIt (https://docs.python.org/3/library/timeit.html) ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ํ…Œ์ŠคํŠธํ• ๋•Œ, ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ์‹คํ–‰์‹œ๊ฐ„์ด ์•„๋‹Œ ํŠน์ • ํ•จ์ˆ˜๋‚˜ ์ฝ”๋“œ์˜ ์‹คํ–‰์‹œ๊ฐ„์„ ํŠน์ •ํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. (* ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ ์ฐธ์กฐ, ํด๋ฆญํ•˜์—ฌ ์›๋ณธ์ด๋ฏธ์ง€๋กœ ๋ณด๋Š”๊ฒŒ ํŽธํ•ฉ๋‹ˆ๋‹ค.) โœ… timeit.timeit(stmt='pass', setup='pass', timer=, number=1000000, globals=None) โ–ถ๏ธ stmt: ์ธก์ •ํ•  ํ•จ์ˆ˜๋‚˜ ์ฝ”๋“œ โ–ถ๏ธ setup: setup ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ˆ˜ํ–‰ํ•  ์ฝ”๋“œ์— ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„ โ–ถ๏ธ number: ํ•จ์ˆ˜/์ฝ”๋“œ ๋ฐ˜๋ณต ์‹คํ–‰ ํšŸ์ˆ˜ โ–ถ๏ธ timer: Timer ์ธ์Šคํ„ด์Šค โ–ถ๏ธ repeat: ํƒ€์ด๋จธ ๋ฐ˜๋ณต ํšŸ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’ 5) โ–ถ๏ธ globals: ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. JAVA์— ๋น„ํ•ด์„œ ์„ฑ๋Šฅ์ธก์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค์†Œ ๋‚ ๊ฒƒ์˜ ๋А๋‚Œ์ด ๋“ค๊ธด ํ•˜์ง€๋งŒ, ๊ฝค๋‚˜ ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด๋‹ˆ ์ถฉ๋ถ„ํžˆ ์ž˜ ํ™œ์šฉํ•˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ“š Reference https://whitewing4139.tistory.com/156 https://wikidocs.net/133019 https://velog.io/@hamdoe/Python-cProfile%EA%B3%BC-Pstat%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC%EB%A7%81-%ED%95%98%EA%B8%B0 https://stackoverflow.com/questions/44890932/using-the-globals-argument-of-timeit-timeit

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค