Python Dictionary ์์ ๋ณด์ฅ ์๋ฆฌ
* ์ด ๊ธ์ ์คํ ์ค๋ฒํ๋ก์ฐ์ ์ฌ๋ผ์จ ์ง๋ฌธ์ ์ฌ๊ตฌ์ฑํ ๊ฒ ์ ๋๋ค. * ์ฝ๊ธฐ ์ด๋ ค์ฐ์ ๋ฌธ์ฅ์ ์๋ฌธ์ ํ์ธํด๋ณด์๋ ๊ฑธ ๊ถ์ฅํด๋๋ฆฝ๋๋ค. * ์ด ๊ธ์ PC์์ ๋ณด๊ธฐ ํธํฉ๋๋ค.
Python 3.6 ์ด์์์ Dictionary๊ฐ ์์ ๋ณด์ฅ์ด ๋๋์?
๋ค. CPython์์ ์ฝ์ ์์๊ฐ ์ ์ง๋ฉ๋๋ค. ํ์ง๋ง CPython ์ธ ๋ค๋ฅธ ๊ตฌํ์ฒด์์๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ฆ, ์ด ๊ธฐ๋ฅ์ CPython 3.6์ Implementation detail ์ ๋๋ค. (Python 3.7๋ถํฐ, ์ ๋ด์ฉ์ด Implementation detail์ด ์๋ ์ธ์ด ๊ธฐ๋ณธ feature๊ฐ ๋์์ต๋๋ค. Python 3.7๋ถํฐ๋ ๊ตฌํ์ฒด์ ๋ฌด๊ดํ๊ฒ ์ฝ์ ์์๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.)
์์๊ฐ ๋ณด์ฅ๋๋๋ฐ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์๋์?
๋ ๊ฐ์ง ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค. PyDictKeyEntry ํ์์ entry๋ค์ ๋ด๋ dk_entries ๋ฐฐ์ด๊ณผ ๊ทธ ์ธ๋ฑ์ค๋ค์ ๋ด๋ dk_indicies ๋ฐฐ์ด์ ์๋๋ค.
์ฒซ๋ฒ์งธ ๋ฐฐ์ด dk_entries๋ ์ฝ์ ์์์ ๋ฐ๋ผ entry(PyDictKeyEntry type)๋ค์ ์ ์ฅํฉ๋๋ค. ์ฆ, ์ฝ์ ์์ ๋ณด์กด์ด ์ด ๋ฐฐ์ด์ ์ํด ์ด๋ค์ง๋๋ค.
๋๋ฒ์งธ ๋ฐฐ์ด dk_indicies๋ dk_entries์ ๊ฐ ์์์ ๋ํ index๋ค์ ์ ์ฅํฉ๋๋ค. ์ฆ, ๊ฐ๊ฐ์ index ๊ฐ์ด dk_entries์ ์์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ด ๋ฐฐ์ด์ ํด์ ํ ์ด๋ธ ์ญํ ์ ํฉ๋๋ค. ํค๊ฐ ํด์๋๋ฉด ๊ทธ ํค๊ฐ dk_indices ์์ ์ ์ฅ๋ index๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ๊ทธ index๋ ๊ทธ์ ๋ง๋ entry๋ฅผ dk_entries์์ ๊ฐ์ ธ์ต๋๋ค. ์ธ๋ฑ์ค๋ค๋ง ์ ์ฅ๋๊ธฐ ๋๋ฌธ์, dk_indices์ ํ์์ Dictionary์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.(int8_t๋ถํฐ int32_6, int64_t๊น์ง)
์ด์ ๊ตฌํ์ฒด์์ , PyDictKeyEntry ํ์์ ํฌ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ dk_size์ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ์ต๋๋ค. ํ์ง๋ง ์ฑ๋ฅ์ ์ด์ ๋ก ๋ฐฐ์ด์ด dk_size์ 2/3 ์ด์์ ์ฌ์ฉํ ์ ์์๊ณ , ์ด์ ๋ฐ๋ผ ๋น๊ณต๊ฐ์ด ๋ง์ด ์๊ฒผ์ต๋๋ค. ๊ฒ๋ค๊ฐ ๋น๊ณต๊ฐ์ด์ด๋ PyDictKeyEntry ํฌ๊ธฐ๋งํผ ์ฐจ์งํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ ์ปธ์ต๋๋ค.
์ด์ ๊ด์ฐฎ์ต๋๋ค. entry ๋ฐฐ์ด์๋ ํ์ entry๋ค๋ง ์ ์ฅํ๊ณ dk_size์ 2/3์ ์ฑ์ฐ๋ intX_t(X๋ Dict์ ๋ฐ๋ผ ๊ฒฐ์ ) ํ์์ ํฌ์ ๋ฐฐ์ด์ด ์ ์ง๋ฉ๋๋ค. ๋น๊ณต๊ฐ ํ์์ด PyDictKeyEntry์์ intX_t๋ก ๋ฐ๋์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์ ์์ต๋๋ค.
์ด ์์ด๋์ด๋ฅผ ์ ์ํ Raymond Hettinger์จ์ ์๋ณธ ๋ฌธ์๋ฅผ ๋ณด๋ฉด, ๋ด์ฉ์ ์๊ฐํ ํ ์๋ฃ๊ฐ ์์ต๋๋ค.
For example, the dictionary:
d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'}
is currently stored as:
entries = [['--', '--', '--'], [-8522787127447073495, 'barry', 'green'], ['--', '--', '--'], ['--', '--', '--'], ['--', '--', '--'], [-9092791511155847987, 'timmy', 'red'], ['--', '--', '--'], [-6480567542315338377, 'guido', 'blue']]
Instead, the data should be organized as follows:
indices = [None, 1, None, None, None, 0, None, 2] entries = [[-9092791511155847987, 'timmy', 'red'], [-8522787127447073495, 'barry', 'green'], [-6480567542315338377, 'guido', 'blue']]
์ ์๋ฃ์์ ๋ณด๋ฏ, ์ด์ ์๋ ๋น ๋ฅธ ๊ฒ์๊ณผ ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํด ๋ง์ ๊ณต๊ฐ์ด ํ์์์ต๋๋ค. ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์์ , entry๋ค์ด ์๋ index์ ํฌ์ ๋ฐฐ์ด์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์๋ ์ ์์ต๋๋ค.
Python-Dev์์ ์ด feature๋ฅผ ๋ค๋ฃฌ ๋ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๊ด์ฌ ์์ผ์๋ฉด ์ฝ์ด๋ณด์ ๋ ์ฆฃ์ ๊ฒ ๊ฐ์ต๋๋ค.
--
์ฒซ๋ฒ์งธ ์ฌ์ง ์ถ์ฒ ๋งํฌ I translatedย an English postย of Stack overflowย to Korean and reorganized it.











