๐ŸŒณASH84

Maker, Developer, Adventurer ๐Ÿคฉ

[๋ฒˆ์—ญ] 6 Python Performance Tips

2015-03-04

์›๋ฌธ : http://blog.newrelic.com/2015/01/21/python-performance-tips/?utm_source=Python+Weekly+Newsletter&utm_campaign=c403fa901e-Python_Weekly_Issue_175_January_22_2015&utm_medium=email&utm_term=0_9e26887fc5-c403fa901e-312692397

1. ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ ์™ธ๋ถ€ ํŒจํ‚ค์ง€์— ์˜์กดํ•ด๋ผ.

ํŒŒ์ด์ฌ์€ ์‰ฝ์ง€๋งŒ, ์‹œ๊ฐ„๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋Š” ์ž‘์—…๋“ค์—์„œ ์ข‹์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ C, C++ ๊ธฐ๊ณ„์–ด, ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ํŒจํ‚ค์ง€๋“ค์€ ํ”Œ๋žซํผ ์ง€ํ–ฅ์ (platform-specific)์ธ๋ฐ, ์ฆ‰ ํ”Œ๋žซํผ ์ง€ํ–ฅ์ ์ธ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ”Œ๋žซํผ์— ์ข…์†์ ์œผ๋กœ ๋˜์–ด ๋ฒ„๋ฆฌ๋Š”๋ฐ, ์ด๋Š” ์„ฑ๋Šฅ๊ณผ ์ด์‹์„ฑ์„ ๊ตํ™˜ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. CPYTHON, PyInIne PyPy, Pyrex ๊ฐ™์€ ๊ฒƒ ๋“ค์ด ์žˆ๋‹ค.

2. ์ •๋ ฌ์‹œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ.

์˜ค๋ž˜๋œ ํŒŒ์ด์ฌ ์ •๋ ฌ์ฝ”๋“œ๋Š” ์ปค์Šคํ…€ ์ •๋ ฌ์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์‹œ๊ฐ„์ด ๋“ค๊ณ  ์‹ค์ œ๋กœ ์ •๋ ฌ์ˆ˜ํ–‰ํ•˜๋Š” ์†๋„๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋Šฅํ•œํ•œ ๊ธฐ์กด sort() ๋ฉ”์†Œ๋“œ์— key ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด, key ์ธ์ž๋กœ ์ง€์ •ํ•œ index ์— ์˜ํ•ด์„œ ์ •๋ ฌ์ด ๋˜์–ด ์ง„๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ˆซ์žํ˜• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฌธ์žํ˜•์—์„œ ์“ธ์ˆ˜ ์žˆ๋‹ค.

3. ๋ฃจํ”„ ์ตœ์ ํ™”

๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋ฃจํ”„ ์ตœ์ ํ™”๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค. ํŒŒ์ด์ฌ์—์„œ ๋ฃจํ”„๋ฅผ ์ข€๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์„ ์˜์ง€ํ•ด์•ผ ํ•œ๋‹ค.(์ฐพ์œผ๋ผ๋Š” ์• ๊ธฐ) ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ์ƒ์—์„œ ๋†“์น˜๋Š” ๊ฒƒ์€ ๋ฃจํ”„์•ˆ์—์„œ ์ (dots)์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๋ฃจํ”„ ์•ˆ์—์„œ .์„ ํ†ตํ•œ ํ˜ธ์ถœ์˜ ์• ๊ธฐ)

์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด, ๋งค๋ฒˆ str.upper ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ํŒŒ์ด์ฌ์€ ์ด๊ฒƒ์„ ๋ฉ”์†Œ๋“œ๋กœ ํ‰๊ฐ€ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ๋ถ€๋ถ„์€ ๋ณ€์ˆ˜๋กœ ํ‰๊ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด, ์ด๋ฏธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ›จ์”ฌ ๋” ์ž‘์—…์ด ๋นจ๋ผ์ง„๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฃจํ”„ ์•ˆ์—์„œ ์ผ์˜ ์–‘์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

๋ฃจํ”„ ์ตœ์ ํ™”์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ์ด๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๊ณ  ๋ฆฌ์ŠคํŠธ ์ถ•์•ฝ ์†๋„ ์ด์ ์„ ๊ฐ€์ ธ๋‹ค ์ค€๋‹ค. ์ค‘์š”ํ•œ ์ ์€ ๋ฃจํ”„ ์ตœ์ ํ™”๊ฐ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

4. ์ƒˆ๋กœ์šด ๋ฒ„์ „

๋ชจ๋“  ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์ด ๊ทธ ์ด์ „ ๋ณด๋‹ค ๋น ๋ฅด๋‹ค.(์ตœ์ ํ™” ํฌํ•จ) ์ œํ•œ ๋˜๋Š”๋ถ€๋ถ„์€ ์„ ํ˜ธํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ํŒŒ์ด์ฌ ๋ฒ„์ „์œผ๋กœ ์˜ฎ๊ฒจ์กŒ๋Š”์ง€, ์ด์‹์ด ๋˜์—ˆ๋Š”๊ฐ€ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์ค‘์š”ํ•œ์งˆ๋ฌธ์€ ์–ธ์ œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์ถฉ๋ถ„ํ•˜๊ฒŒ ์ง€์›ํ• ์ง€์— ๋Œ€ํ•œ๊ฒƒ.

์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ ์—ฌ์ „ํžˆ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•ด์•ผํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌธ์ œ ์—†๋Š”์ง€ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค. ์ผ๋‹จ ์˜ฎ๊ฒจ๊ฐ€๊ณ  ๋‚˜๋ฉด ํ”„๋กœํŒŒ์ผ๋ง์„ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ ํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด๋ผ.

5. ๋ฉ€ํ‹ฐ ์ฝ”๋”ฉ ์ ‘๊ทผ์„ ์‹œ๋„ํ•ด๋ผ

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋•Œ ๋งค๋ฒˆ ๊ฐ™์€ ์ฝ”๋”ฉ ์ ‘๊ทผ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋Š๋ฆฌ๊ฒŒ ํ• ์ˆ˜๋„ ์žˆ๋‹ค.(๋Š˜ ๊ฐ™์€๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ์‹คํ—˜์„ ํ•ด๋ณด๋ผ๋Š” ์ด์•ผ๊ธฐ) ํ”„๋กœํŒŒ์ผ๋ง ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ์„œ ์ž‘์€ ์‹คํ—˜์„ ์‹œ๋„ํ•ด๋ผ. ์˜ˆ๋ฅผ๋“ค์–ด, ์‚ฌ์ „ํ˜•์‹(dict)๋‚ด์˜ ์•„์ดํ…œ์„ ๊ด€๋ฆฌํ• ๋•Œ, ์•„์ดํ…œ์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ๊ฐฑ์‹ ํ• ์ง€ ๋˜๋Š” ๋ฐ”๋กœ ์•„์ดํ…œ์„ ์‚ฝ์ž…ํ•˜๊ณ  ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ ์•„์ดํ…œ์ด ์กด์žฌ ํ•˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์— ๋Œ€ํ•œ ์ ‘๊ทผ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณด๋ฉด,

์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด,

์œ„์˜ ์ฝ”๋“œ๋Š”myDict์ด ๋น„์–ด ์žˆ์„๋•Œ๋Š” ๋น ๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ myDict ์ด ๋ณดํ†ต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—, ๋” ๋‚˜์€ ์ ‘๊ทผ์ด ์žˆ๋‹ค.

output ์€ {โ€˜dโ€™: 4, โ€˜cโ€™: 4, โ€˜bโ€™: 4, โ€˜aโ€™: 4} ์œผ๋กœ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๊ฐ™๋‹ค. ์˜ค์ง ์ฐจ์ด๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ๊ณผ๋Š” ์–ป๋Š๋ƒ์˜ ์ฐจ์ด์ด๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋”ฉ ๊ธฐ์ˆ ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋” ๋นจ๋ฆฌ ์–ป๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค.

6. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋กœ์Šค ์ปดํŒŒ์ผ

๊ฐœ๋ฐœ์ž๋Š” ๋•Œ๋•Œ๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ํ˜„๋Œ€์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋–ค ์–ธ์–ด๋กœ ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์–ด๋จน๋Š”๋‹ค. ์ปดํ“จํ„ฐ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ด์•ผ๊ธฐํ•œ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„๊ฐ€ ์ดํ•ดํ• ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ํŒŒ์ด์ฌ๊ณผ ๊ฐ™์€ ์–ธ์–ด๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์„ฑ๋Šฅ์ ์ธ ์ธก๋ฉด์œผ๋กœ C++๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์šด์˜๋œ๋‹ค. ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์— ์˜์กด์ ์ด๋‹ค. ํ•œ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ํฌ๋กœ์Šค ์ปดํŒŒ์ผ๋Ÿฌ์ธ Nuitka ๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ C++ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์•„๋‹Œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ• ์ˆ˜ ์žˆ๋‹ค. ํ”Œ๋žซํผ๊ณผ ํ…Œ์Šคํฌ์— ์˜์กดํ•จ์œผ๋กœ์จ, ๋†€๋ผ์šด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํฌ๋กœ์Šค ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ• ๋•Œ ํ™•์ธํ•ด์•ผ ํ• ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ์ง€์›Œํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ผ. Nuitka๋Š” ํŒŒ์ด์ฌ 2.6, 2.7, 3.2, 3.3์„ ์ง€์›ํ•œ๋‹ค. ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ C++ ์ปดํŒŒ์ผ๋Ÿฌ ๋‘˜๋‹ค ํ•„์š”ํ•˜๋‹ค. Nuitka ๋Š” ์ˆ˜๋งŽ์€ C++ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ง€์›ํ•˜๋Š”๋ฐ Microsoft Visual Studio, MinGW, Clang/LLVM ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค. ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์€ ๋ช‡๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์„์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, Nuitka์™€ ํ•จ๊ป˜ ๋™์ž‘ํ• ๋•Œ, ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์ด ํฐ ๋“œ๋ผ์ด๋ธŒ ๊ณต๊ฐ„์„ ์†Œ๋ชจ ํ•˜๋Š”๊ฒƒ์„ ๋ณผ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์€ Nuitka ๊ฐ€ ํŒŒ์ด์ฌ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ ๋งŽ์€ DDL๋“ค์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œ์•ฝ๋˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค๋ฉด ์ด ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š์„๊ฒƒ ์ด๋‹ค.

ํ•ต์‹ฌ(Bottom line)

์ด ๊ธ€์—์„œ์˜ 3๊ฐ€์ง€ ๊ฐ๊ฐ์˜ ํŒ๋“ค์€ ์ข€๋” ๋น ๋ฅธ ํŒŒ์ด์ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์€ ์ด์•Œ์€ ์—†๋‹ค.(But there are no silver bullets.) ํŒ๋“ค์ค‘ ์–ด๋Š๊ฒƒ๋„ ๋งค๋ฒˆ ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์„๊ฒƒ์ด๋‹ค. ์–ด๋–ค ๊ฒƒ์€ ํŒŒ์ด์ฌ์˜ ํŠน์ •์—์„œ ๋” ๋‚˜์„๊ฒƒ์ด๋‹ค-์‹ฌ์ง€์–ด ํ”Œ๋žซํผ๋งˆ๋‹ค ๋‹ค๋ฅผ์ˆ˜๋„ ์žˆ๋‹ค. ์–ด๋Š ๋ถ€๋ถ„์ด ๋Š๋ฆฐ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ์„ ํ•ด๋ณด๋Š”๊ฒƒ์ด ํ•„์š”ํ•˜๋ฉฐ ๊ทธ๋ฆฌ๊ณ  ํŒ์„ ์‹œ๋„ํ•ด ๋ณด๋ฉด, ํ•ด๋‹น ์ด์Šˆ์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.


#blog.newrelic.com'  #dev  #Performance  #python performance tips  #๋ฒˆ์—ญ  #์„ฑ๋Šฅ  #ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.  #ํŒŒ์ด์ฌ