딥러닝 기초 예제 연습을 위해 출처가 다른 같은 종류의 train 데이터셋과 validation 데이터셋을 준비했습니다.
train에는 있는데 validation에는 없는 디렉토리를 확인하여 모두 제거하는 과정에서 파이썬 기초 문법인 for와 in에 대해 궁금증이 생겼습니다. (+ 작은 궁금증에서 파생된 두번째 궁금증도 있습니다.)
📌 궁금증
for와 if ... in ... 의 시간복잡도 차이
기본적으로 하나의 for는 O(N)의 시간 복잡도를 갖는다는 사실을 알고 있습니다.
그렇다면 if - in의 시간 복잡도는 어떻게 될까 궁금했습니다.
🎲 해결중...
파이썬 공식 문서(https://wiki.python.org/moin/TimeComplexity)에 의하면
s가 list인 경우의 in 연산자는 O(N)의 시간 복잡도를 갖습니다.
s가 set인 경우는 평균 O(1), 최악의 경우 O(N)의 시간 복잡도를 갖는다고 합니다.
여기서 갑자기 또다른 궁금증이 생겼습니다.
set의 경우 평균적으로 O(1)의 시간복잡도를 갖는다는데.. 상식선에서 이해가 되질 않더군요.
아래에서 관련된 내용을 찾아보고 적용해보았습니다.
이어서 list의 경우를 다시 생각해봅시다.
예시로 제가 사용한 test, validation 파일명 리스트를 사용해보겠습니다.
trains = ['Zapdos', 'Kadabra', 'Omanyte', 'Shellder', 'Bellsprout', 'Eevee', 'Jolteon', 'Hypno', 'Seel', 'Zubat', 'Graveler', 'Magneton', 'Abra', 'Kingler', 'Alakazam', 'Clefable', 'Gyarados', 'Poliwag', 'Rapidash', 'Machamp', 'Pinsir', 'Muk', 'Seaking', 'Magikarp', 'Goldeen', 'Venusaur', 'Flareon', 'Jigglypuff', 'Doduo', 'Weedle', 'Vileplume', 'Arcanine', 'Tentacruel', 'Gloom', 'Charmeleon', 'Articuno', 'Sandshrew', 'Spearow', 'Marowak', 'Clefairy', 'Snorlax', 'Scyther', 'Primeape', 'Diglett', 'Onix', 'Mankey', 'Rattata', 'Voltorb', 'Gengar', 'Gastly', 'Cloyster', 'Weepinbell', 'Dragonair', 'Squirtle', 'Pikachu', 'Victreebel', 'Charmander', 'Staryu', 'Venonat', 'Vaporeon', 'Ivysaur', 'Krabby', 'Drowzee', 'Sandslash', 'Kangaskhan', 'Chansey', 'Butterfree', 'Starmie', 'Magmar', 'Beedrill', 'Ninetales', 'Magnemite', 'Metapod', 'Electrode', 'Raichu', 'Fearow', 'Mewtwo', 'Kabuto', 'Pidgeotto', 'Hitmonchan', 'Blastoise', 'Weezing', 'Golbat', 'Seadra', 'Rhyhorn', 'Moltres', 'Golduck', 'Kabutops', 'Aerodactyl', 'Haunter', 'Machop', 'Koffing', 'Pidgeot', 'Wigglytuff', 'Porygon', 'Vulpix', 'Dugtrio', 'Ditto', 'Raticate', 'Geodude', 'Tentacool', 'Horsea', 'Oddish', 'Machoke', 'Lapras', 'Poliwrath', 'Omastar', 'Slowpoke', 'Bulbasaur', 'Growlithe', 'Ponyta', 'Parasect', 'Dodrio', 'Meowth', 'Exeggutor', 'Persian', 'Psyduck', 'Tauros', 'Pidgey', 'Electabuzz', 'Dewgong', 'Wartortle', 'Nidoking', 'Grimer', 'Ekans', 'Caterpie', 'Tangela', 'Kakuna', 'Golem', 'Slowbro', 'MrMime', 'Jynx', 'Mew', 'Paras', 'Hitmonlee', 'Exeggcute', 'Arbok', 'Venomoth', 'Dratini', 'Cubone', 'Rhydon', 'Dragonite', 'Nidorino', 'Lickitung', 'Nidorina', 'Charizard', 'Poliwhirl', 'Nidoqueen', 'Farfetchd']
validations = ['Mandibuzz', 'Corviknight', 'Throh', 'Ducklett', 'Larvesta', 'Lampent', 'Zapdos', 'Kadabra', 'Diancie', 'Inkay', 'Raboot', 'Roggenrola', 'Regigigas', "Farfetch'd", 'Omanyte', 'Glameow', 'Munna', 'Shellder', 'Bellsprout', 'Pansage', 'Tympole', 'Chandelure', 'Gallade', 'Phione', 'Eevee', 'Jolteon', 'Gurdurr', 'Noibat', 'Gliscor', 'Stunfisk', 'Hypno', 'Kricketot', 'Breloom', 'Carvanha', 'Meowstic', 'Wynaut', 'Vanillite', 'Sawsbuck', 'Accelgor', 'Toxtricity', 'Gigalith', 'Kingdra', 'Haxorus', 'Deino', "Sirfetch'd", 'Celesteela', 'Tyrantrum', 'Pumpkaboo', 'Seel', 'Braviary', 'Gothitelle', 'Chikorita', 'Honedge', 'Meditite', 'Sobble', 'Archen', 'Drapion', 'Meganium', 'Eldegoss', 'Tornadus', 'Politoed', 'Quilava', 'Dusclops', 'Orbeetle', 'Reshiram', 'Baltoy', 'Absol', 'Zubat', 'Thundurus', 'Terrakion', 'Dartrix', 'Ralts', 'Pineco', 'Armaldo', 'Rowlet', 'Cottonee', 'Graveler', 'Boltund', 'Wishiwashi', 'Hakamo-o', 'Pichu', 'Magneton', 'Toxicroak', 'Sigilyph', 'Mudbray', 'Oranguru', 'Palkia', 'Mienshao', 'Zeraora', 'Golisopod', 'Cherrim', 'Unown', 'Rillaboom', 'Corphish', 'Dhelmise', 'Crawdaunt', 'Scorbunny', 'Naganadel', 'Alcremie', 'Patrat', 'Garchomp', 'Bayleef', 'Tsareena', 'Grumpig', 'Pansear', 'Drednaw', 'Flapple', 'Duskull', 'Prinplup', 'Greedent', 'Spinarak', 'Lugia', 'Abra', 'Combusken', 'Unfezant', 'Golurk', 'Kingler', 'Alakazam', 'Binacle', 'Clefable', 'Swellow', 'Meltan', 'Heatran', 'Avalugg', 'Salamence', 'Gyarados', 'Stoutland', 'Pelipper', 'Escavalier', 'Pignite', 'Aron', 'Slurpuff', 'Cacturne', 'Poliwag', 'Excadrill', 'Carbink', 'Probopass', 'Cresselia', 'Shinx', 'Sewaddle', 'Doublade', 'Heatmor', 'Lurantis', 'Emolga', 'Silcoon', 'Loudred', 'Sawk', 'Hoppip', 'Shelmet', 'Watchog', 'Shaymin', 'Minun', 'Rapidash', 'Goodra', 'Carnivine', 'Clobbopus', 'Nosepass', 'Numel', 'Chespin', 'Rookidee', 'Wingull', 'Gardevoir', 'Machamp', 'Klefki', 'Pinsir', 'Gible', 'Seedot', 'Rockruff', 'Torracat', 'Darmanitan', 'Muk', 'Sliggoo', 'Seaking', 'Magikarp', 'Floatzel', 'Phantump', 'Alomomola', 'Type Null', 'Staravia', 'Thievul', 'Goldeen', 'Eelektrik', 'Crobat', 'Venusaur', 'Clamperl', 'Gabite', 'Sylveon', 'Scizor', 'Solgaleo', 'Cherubi', 'Shelgon', 'Zangoose', 'Flareon', 'Coalossal', 'Toxapex', 'Druddigon', 'Brionne', 'Clawitzer', 'Relicanth', 'Typhlosion', 'Hydreigon', 'Jigglypuff', 'Doduo', 'Chewtle', 'Reuniclus', 'Buizel', 'Weedle', 'Aipom', 'Aegislash', 'Buzzwole', 'Pachirisu', 'Eternatus', 'Registeel', 'Galvantula', 'Vileplume', 'Togekiss', 'Cursola', 'Beldum', 'Shiftry', 'Archeops', 'Xurkitree', 'Trumbeak', 'Skuntank', 'Wailmer', 'Dottler', 'Arcanine', 'Klinklang', 'Tentacruel', 'Vigoroth', 'Krookodile', 'Karrablast', 'Lumineon', 'Vivillon', 'Volbeat', 'Gloom', 'Charmeleon', 'Bewear', 'Solosis', 'Articuno', 'Palpitoad', 'Ludicolo', 'Sandshrew', 'Spearow', 'Mime Jr', 'Marowak', 'Burmy', 'Mantine', 'Mudsdale', 'Pangoro', 'Furret', 'Kubfu', 'Cosmog', 'Florges', 'Clefairy', 'Carracosta', 'Mr. Mime', 'Snorlax', 'Obstagoon', 'Cutiefly', 'Minccino', 'Serperior', 'Pyukumuku', 'Purugly', 'Hawlucha', 'Zacian', 'Spoink', 'Glalie', 'Tapu Fini', 'Scyther', 'Sandaconda', 'Primeape', 'Diglett', 'Basculin', 'Pupitar', 'Rampardos', 'Hariyama', 'Runerigus', 'Mareep', 'Spectrier', 'Azumarill', 'Pheromosa', 'Sandile', 'Zamazenta', 'Onix', 'Mankey', 'Skitty', 'Scolipede', 'Ariados', 'Rattata', 'Amaura', 'Blissey', 'Panpour', 'Wobbuffet', 'Dragapult', 'Castform', 'Fletchling', 'Voltorb', 'Seismitoad', 'Gengar', 'Metagross', 'Mimikyu', 'Pancham', 'Grubbin', 'Surskit', 'Grookey', 'Miltank', 'Sizzlipede', 'Altaria', 'Gastly', 'Virizion', 'Camerupt', 'Spinda', 'Piplup', 'Dewott', 'Grovyle', 'Whiscash', 'Emboar', 'Diggersby', 'Goomy', 'Silicobra', 'Cloyster', 'Weepinbell', 'Decidueye', 'Popplio', 'Luxio', 'Yungoos', 'Jellicent', 'Gossifleur', 'Qwilfish', 'Cryogonal', 'Hattrem', 'Sinistea', 'Garbodor', 'Weavile', 'Dragonair', 'Taillow', 'Frogadier', 'Squirtle', 'Lopunny', 'Rolycoly', 'Porygon-Z', 'Lotad', 'Milcery', 'Stufful', 'Cacnea', 'Noivern', 'Floette', 'Finneon', 'Pikachu', 'Eiscue', 'Granbull', 'Gligar', 'Drakloak', 'Dedenne', 'Ursaring', 'Victreebel', 'Braixen', 'Mantyke', 'Mienfoo', 'Meloetta', 'Entei', 'Furfrou', 'Skwovet', 'Deerling', 'Magmortar', 'Centiskorch', 'Charmander', 'Staryu', 'Togetic', 'Cradily', 'Rufflet', 'Zebstrika', 'Crabominable', 'Necrozma', 'Fomantis', 'Bonsly', 'Lileep', 'Rhyperior', 'Drizzile', 'Beheeyem', 'Sharpedo', 'Mamoswine', 'Venonat', 'Shuckle', 'Bunnelby', 'Delphox', 'Suicune', 'Vaporeon', 'Ninjask', 'Piloswine', 'Toxel', 'Hippowdon', 'Stunky', 'Ivysaur', 'Zekrom', 'Krabby', 'Stantler', 'Grotle', 'Duosion', 'Chingling', 'Teddiursa', 'Drowzee', 'Abomasnow', 'Sandslash', 'Bisharp', 'Cinderace', 'Tyrogue', 'Marshtomp', 'Thwackey', 'Boldore', 'Heliolisk', 'Girafarig', 'Chesnaught', 'Banette', 'Claydol', 'Mareanie', 'Kangaskhan', 'Raikou', 'Ferroseed', 'Totodile', 'Cinccino', 'Noctowl', 'Treecko', 'Chansey', 'Butterfree', 'Cufant', 'Eelektross', 'Vullaby', 'Kricketune', 'Dialga', 'Krokorok', 'Ledian', 'Tyrunt', 'Trapinch', 'Ambipom', 'Aurorus', 'Yamper', 'Beautifly', 'Starmie', 'Bounsweet', 'Timburr', 'Shedinja', 'Cyndaquil', 'Foongus', 'Scrafty', 'Incineroar', 'Natu', 'Swablu', 'Fraxure', 'Darkrai', 'Makuhita', 'Sceptile', 'Slaking', 'Torchic', 'Tapu Bulu', 'Trubbish', 'Pawniard', 'Gorebyss', 'Quilladin', 'Arceus', 'Ribombee', 'Minior', 'Flaaffy', 'Salandit', 'Pidove', 'Empoleon', 'Manaphy', 'Munchlax', 'Frosmoth', 'Calyrex', 'Honchkrow', 'Magmar', 'Electrike', 'Inteleon', 'Zygarde', 'Beedrill', 'Hoopa', 'Celebi', 'Scraggy', 'Nihilego', 'Liepard', 'Jumpluff', 'Ninetales', 'Magnemite', 'Octillery', 'Barraskewda', 'Cranidos', 'Dwebble', 'Dracovish', 'Yanma', 'Bellossom', 'Carkol', 'Vikavolt', 'Oricorio', 'Dubwool', 'Metapod', 'Electrode', 'Lickilicky', 'Golett', 'Ampharos', 'Glastrier', 'Chinchou', 'Smoochum', 'Magcargo', 'Guzzlord', 'Misdreavus', 'Palossand', 'Larvitar', 'Raichu', 'Bergmite', 'Fearow', 'Petilil', 'Mewtwo', 'Regice', 'Dewpider', 'Kabuto', 'Litten', 'Pidgeotto', 'Hitmonchan', 'Komala', 'Darumaka', 'Wormadam', 'Grimmsnarl', 'Zoroark', 'Durant', 'Blastoise', 'Spewpa', 'Weezing', 'Croconaw', 'Golbat', 'Clauncher', 'Seadra', 'Lombre', 'Rhyhorn', 'Budew', 'Yveltal', 'Bronzong', 'Swirlix', 'Moltres', 'Araquanid', 'Blipbug', 'Golduck', 'Mudkip', 'Snover', 'Tyranitar', 'Herdier', 'Kabutops', 'Kommo-o', 'Aerodactyl', 'Volcarona', 'Swalot', 'Smeargle', 'Kirlia', 'Haunter', 'Spritzee', 'Wooper', 'Mesprit', 'Staraptor', 'Torterra', 'Xerneas', 'Spheal', 'Bastiodon', 'Simisear', 'Gumshoos', 'Genesect', 'Remoraid', 'Hatenna', 'Magnezone', 'Jangmo-o', 'Sudowoodo', 'Crabrawler', 'Charjabug', 'Machop', 'Tranquill', 'Roserade', 'Silvally', 'Espeon', 'Regieleki', 'Koffing', 'Vanilluxe', 'Pidgeot', 'Wigglytuff', 'Melmetal', 'Blaziken', 'Uxie', 'Oshawott', 'Porygon', 'Walrein', 'Polteageist', 'Tangrowth', 'Arctovish', 'Bibarel', 'Mothim', 'Conkeldurr', 'Vulpix', 'Dugtrio', 'Barbaracle', 'Gastrodon', 'Swadloon', 'Sentret', 'Buneary', 'Ditto', 'Raticate', 'Sunkern', 'Skiddo', 'Arrokuda', 'Trevenant', 'Sealeo', 'Geodude', 'Bidoof', 'Magearna', 'Litleo', 'Victini', 'Corsola', 'Mismagius', 'Venipede', 'Tentacool', 'Skorupi', 'Horsea', 'Oddish', 'Starly', 'Passimian', 'Falinks', 'Flygon', 'Salazzle', 'Snorunt', 'Machoke', 'Duraludon', 'Aggron', 'Copperajah', 'Azelf', 'Lapras', 'Hippopotas', 'Keldeo', 'Mr. Rime', 'Elgyem', 'Whirlipede', 'Morgrem', 'Poliwrath', 'Cubchoo', 'Delibird', 'Omastar', 'Fennekin', 'Heracross', 'Nuzleaf', 'Slowpoke', 'Tropius', 'Scatterbug', 'Corvisquire', 'Servine', 'Bulbasaur', 'Axew', 'Gourgeist', 'Simisage', 'Luxray', 'Espurr', 'Growlithe', 'Torkoal', 'Wooloo', 'Houndoom', 'Aromatisse', 'Gulpin', 'Stakataka', 'Dustox', 'Kartana', 'Perrserker', 'Gogoat', 'Latios', 'Milotic', 'Hoothoot', 'Ponyta', 'Parasect', 'Azurill', 'Manectric', 'Tepig', 'Dodrio', 'Meowth', 'Fletchinder', 'Tynamo', 'Dracozolt', 'Exeggutor', 'Dunsparce', 'Klink', 'Persian', 'Appletun', 'Bagon', 'Spiritomb', 'Latias', 'Regirock', 'Combee', 'Glaceon', 'Groudon', 'Hitmontop', 'Vespiquen', 'Togedemaru', 'Skarmory', 'Psyduck', 'Cleffa', 'Yamask', 'Samurott', 'Morpeko', 'Poochyena', 'Tirtouga', 'Froakie', 'Ho-oh', 'Ferrothorn', 'Morelull', 'Snivy', 'Pincurchin', 'Wurmple', 'Beartic', 'Tauros', 'Slugma', 'Zarude', 'Deoxys', 'Yanmega', 'Froslass', 'Zorua', 'Feraligatr', 'Pidgey', 'Lunatone', 'Rayquaza', 'Electabuzz', 'Donphan', 'Murkrow', 'Gothorita', 'Vibrava', 'Skiploom', 'Anorith', 'Nickit', 'Togepi', 'Dewgong', 'Elekid', 'Feebas', 'Klang', 'Frillish', 'Helioptile', 'Umbreon', 'Indeedee', 'Marill', 'Chatot', 'Lycanroc', 'Comfey', 'Shieldon', 'Musharna', 'Slakoth', 'Stonjourner', 'Wartortle', 'Whismur', 'Cobalion', 'Woobat', 'Amoonguss', 'Snom', 'Nidoking', 'Jirachi', 'Bouffalant', 'Grapploct', 'Quagsire', 'Solrock', 'Leavanny', 'Grimer', 'Swinub', 'Mightyena', 'Ekans', 'Porygon2', 'Electivire', 'Impidimp', 'Magby', 'Turtonator', 'Ledyba', 'Infernape', 'Sandygast', 'Xatu', 'Leafeon', 'Shiinotic', 'Caterpie', 'Slowking', 'Metang', 'Tangela', 'Giratina', 'Toucannon', 'Drilbur', 'Swampert', 'Dusknoir', 'Rotom', 'Snubbull', 'Pyroar', 'Purrloin', 'Whimsicott', 'Hatterene', 'Audino', 'Linoone', 'Zigzagoon', 'Pikipek', 'Kakuna', 'Urshifu', 'Golem', 'Cascoon', 'Slowbro', 'Illumise', 'Nincada', 'Bruxish', 'Shellos', 'Jynx', 'Arctozolt', 'Tapu Lele', 'Vanillish', 'Mew', 'Lunala', 'Malamar', 'Wimpod', 'Primarina', 'Riolu', 'Cosmoem', 'Igglybuff', 'Paras', 'Houndour', 'Masquerain', 'Sunflora', 'Hitmonlee', 'Shuppet', 'Exeggcute', 'Simipour', 'Lairon', 'Lucario', 'Cramorant', 'Shroomish', 'Crustle', 'Blacephalon', 'Skrelp', 'Swanna', 'Marshadow', 'Arbok', 'Joltik', 'Litwick', 'Roselia', 'Dreepy', 'Landorus', 'Poipole', 'Venomoth', 'Lillipup', 'Huntail', 'Kecleon', 'Greninja', 'Steelix', 'Bronzor', 'Turtwig', 'Kyogre', 'Medicham', 'Volcanion', 'Exploud', 'Maractus', 'Talonflame', 'Drifblim', 'Happiny', 'Dratini', 'Drifloon', 'Applin', 'Cubone', 'Zweilous', 'Phanpy', 'Croagunk', 'Rhydon', 'Drampa', 'Regidrago', 'Barboach', 'Wailord', 'Sneasel', 'Mawile', 'Dragonite', 'Chimchar', 'Steenee', 'Nidorino', 'Plusle', 'Chimecho', 'Tapu Koko', 'Swoobat', 'Lilligant', 'Lanturn', 'Delcatty', 'Dragalge', 'Lickitung', 'Cofagrigus', 'Blitzle', 'Monferno', 'Nidorina', 'Gothita', 'Luvdisc', 'Seviper', 'Charizard', 'Forretress', 'Poliwhirl', 'Nidoqueen', 'Kyurem', 'Sableye']
각각의 길이가 149, 895인 리스트입니다.
for - in 으로 같은 이름의 파일명 뽑기
count = []
for validation in validations:
for train in trains:
if validation == train:
count.append(validation)
# len(count) = 147
위의 이중 for문은 총 149 * 895의 비교가 진행될 것입니다.
시간 복잡도는 O(N^2)을 가지겠죠.
같은 요소를 찾는 가장 최악의 방법이지 않을까 싶습니다.
if - in 으로 같은 이름의 파일명 뽑기
count = []
for validation in validations:
if validation in trains:
count.append(validation)
# len(count) = 147
이중 for문 대신 if - in 연산을 사용한 방법입니다.
이중 for문과 마찬가지로 모든 요소를 순회하기 때문에 149 * 895의 연산을 진행할 것이고 시간 복잡도는 O(N^2)이 됩니다.
이 두 방법이 차이가 나려면 이중 for문 방법을 살짝 수정해야합니다.
break가 추가된 이중 for문
count = []
for validation in validations:
for train in trains:
if validation == train:
count.append(validation)
break # 추가된 부분
# len(count) = 147
최악의 경우는 O(N^2)로 같겠지만 확률적으로 비교적 빠른 방법이지 않을까 싶습니다.
물론 그 효과는 아주 미미할 것입니다. 결과적으로 코드를 구현할 때 드는 시간적 비용은 시간 복잡도에 의존하게 되니까요.
🔥 결론
사실은 여기까지가 1차 궁금증이었습니다.
결론적으로 for나 if 모두 in연산자의 시간 복잡도로 동작한다는 것이지요.
음.. 결론을 내고 보니 조금 부끄러웠습니다. 궁금증이 생긴 이유가 파이썬 기초가 부족한 탓이 아니었나 싶더라구요.
하지만 위에서 언급한 set의 시간복잡도가 발목을 잡았기에 새로운 궁금증도 해결해보도록 하겠습니다.
📌 새로운 궁금증
set()의 시간복잡도
다시 파이썬 공식문서의 시간 복잡도를 확인하면 set에서의 in 연산자는 평균적으로 O(1)의 시간 복잡도를 갖는 것을 알 수 있습니다.
그 이유에 대해 열심히 구글링을 해본 결과 set과 dict의 자료구조에 대해 알게 되었습니다.
🎲 해결중...
결론부터 말씀드리면 set과 dict는 hash 자료구조를 사용하기 때문에 빠른 탐색이 가능합니다.
hash란 임의의 변수를 고정된 길이의 숫자(hash값)로 변환하여 매핑하는 것을 의미합니다.
쉽게 말해 임의의 길이의 변수값을 넣으면 해시함수를 통해 고유의 해시값이 반환되고 그 해시값이 곧 인덱스?가 되는 것입니다.
(고유의 해시값: 이해를 위해 고유의 해시값이라고 했지만 해시값은 중복되는 경우도 있다고 합니다. 이를 해시값 충돌이라고 하고 여러 해결방법이 존재합니다.)
dict의 경우 key-value 구조이고, set은 key만 존재하는 구조입니다. 그리고 key는 중복이 될 수 없고 순서가 없습니다.
따라서 set의 key에 접근하는 것은 O(1)의 시간복잡도를 갖습니다!
key가 곧 인덱스의 역할을 하기 때문이죠.
그럼 이제 궁금증인 set에 in연산자가 사용된 경우의 시간복잡도가 O(1)인 이유가 어느정도 이해가 됩니다.
set과 in 연산자
count = []
trs = set(trains)
for validation in validations:
if validation in trs:
count.append(validation)
# len(count) = 147
이제 위 방법의 시간복잡도는 O(N * 1)이 될 것입니다. ( list를 set으로 변환하는 시간복잡도는 제외했습니다. )
( 최악의 경우엔 set과 in연산자는 O(N)의 시간복잡도를 갖습니다. )
비교를 위해 코랩 %%timeit을 사용하여 대략적인 시간을 측정해보았습니다.
list 사용
%%timeit -r 10 -n 100
count = []
for validation in validations:
if validation in trains:
count.append(validation)
# 2.53 ms ± 870 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
set 사용
%%timeit -r 10 -n 100
count = []
trs = set(trains)
for validation in validations:
if validation in trs:
count.append(validation)
# 51.9 µs ± 8.66 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
역시나 차이가 나네요.
🔥 결론
작은 궁금증으로부터 나름 큰 수확을 얻은 것 같아 우선 기쁩니다.
set을 중복제거로만 사용했었는데 더 다양하게 사용할 수 있을 것 같네요.
속도도 훨씬 빠르니 알고리즘을 구현할 때 유용하게 사용해야겠습니다.
참고
https://analytics4everything.tistory.com/180
https://velog.io/@ekzm8523/set%EC%A7%91%ED%95%A9-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90
'파이썬 > 심화' 카테고리의 다른 글
matplotlib Customizing: backend (0) | 2024.03.16 |
---|---|
[파이썬] [SSL: CERTIFICATE_VERIFY_FAILED] 해결방법 (0) | 2024.01.11 |
댓글