최근에 코드카타나 Baekjoon 코드 문제를 풀면서 어떻게 해야 가독성이 좋고 효율적인 코드를 작성할 수 있을 지 매 문제마다 고민에 빠졌다.
하지만 내가 생각하는 가독성이 좋고, 효율적인 코드의 그 기준이 명확하지 않아
과연 파이썬에서 말하는 가독성과 효율성이 무엇인지, 어떤 코드가 좋은 파이썬 코드인지 알아보았다.
파이썬에서 import this를 입력하고 실행하면 다음과 같은 Zen of python(파이썬 개발 철학) 19항이 나온다.
정독하고 나니 여태까지 쓸큰코(쓸데없이 큰 코드)를 써내려왔던 스스로가 약간 창피해졌다.
하지만 지금이라도 알았으니 앞으로의 코드는 아래의 개발 철학에 기반하여 '좋은', '파이썬다운' 코드로 작성하기 위해 노력할 것이다.
"""The Zen of Python, by Tim Peters
Beautiful is better than ugly.
아름다운 것이 추한 것 보다 낫다.
Explicit is better than implicit.
명확한 것이 암시적인 것보다 낫다.
Simple is better than complex.
단순한 것이 복잡한 것보다 낫다.
Complex is better than complicated.
복잡한 것이 난해한 것보다 낫다.
Flat is better than nested.
계층적인 것보다 평평한 것이 낫다.
Sparse is better than dense.
빽빽한 것보다 여유있는 것이 낫다.
Readability counts.
가독성이 중요하다.
Special cases aren't special enough to break the rules.
특별한 경우도 규칙을 깨뜨릴 정도로 특별하지 않다.
Although practicality beats purity.
그러나 실용성이 순수함을 이긴다.
Errors should never pass silently.
오류를 조용히 넘기면 안된다.
Unless explicitly silenced.
단, 명시적으로 무시할 경우에는 예외다.
In the face of ambiguity, refuse the temptation to guess.
모호함이 있다면, 추측하려는 유혹을 거부하라.
There should be one-- and preferably only one --obvious way to do it.
한 가지, 가급적이면 단 한 가지의 명확한 방법이 있어야 한다.
Although that way may not be obvious at first unless you're Dutch.
단, 네덜란드인이 아니라면 처음부터 명확하지 않을 수도 있다.
(귀도 반 로섬같은 네덜란드인이 아니라면 파이썬의 명확한 방식이 처음부터 보이지 않을 수도 있다.)
Now is better than never.
지금 하는 것이 안 하는 것보다 낫다.
Although never is often better than *right* now.
다만 지금 당장 하는 것보다 하지 않는 것이 나을 때도 있다.
If the implementation is hard to explain, it's a bad idea.
구현을 설명하기 어렵다면 나쁜 아이디어다.
If the implementation is easy to explain, it may be a good idea.
구현을 쉽게 설명할 수 있다면, 좋은 아이디어일 가능성이 있다.
Namespaces are one honking great idea -- let's do more of those!
네임스페이스는 정말 훌륭한 아이디어다. 더 많이 활용하자!
"""
리스트 컴프리헨션이란? 반복문과 조건문을 한 줄에 간결하게 표현하는 문법으로 for문보다 더 짧고 가독성이 높은 코드를 작성할 수 있다.map(), filter(), zip() 등의 내장 함수는 이터레이터를 반환하기 때문에 메모리를 절약할 수 있다. 리스트를 바로 생성하는 것보다 효율적이다.[표현식 for 변수 in 반복 가능한 객체 if 조건]
즉, 파이썬다운 코드란 1️⃣가독성이 좋고 2️⃣간결하며 3️⃣명확한 코드다.
결국에는 그 코드에 소요되는 시간의 효율성에 대한 문제로 이해된다.
그렇다면 파이썬에서 코드의 연산 처리 속도를 지연시키는 요소는 무엇일까?
어떤 것이 안좋은 코드인걸까?
for문, while문 남용특히 중첩된 반복문이 많아지면 속도가 느려지고 성능이 저하된다.
map()과 리스트 컴프리헨션 활용append()를 호출매번 리스트의 크기가 변경되어 비효율적이다.
list comprehension이 더 빠르다.gloabl 변수 남용함수 내부에서 전역 변수에 직접 접근하게 되어 성능이 저하된다.
list 남용set, dict를 사용하여 탐색 속도를 개선한다.deepcopy() 남용모든 객체를 새로 복사하면 당연하게도 속도가 느려진다.
[:]을 사용한다.print() 남용Input/Output 연산이므로 굉장히 느린 편이다.
for문을 줄이고 한 번의 print로 출력되도록 한다.+연산으로 문자열을 합치기.+연산을 반복하면 새로운 문자열을 계속 생성하기 때문에 속도가 느리다.
join()을 활용한다.pandas에서 apply() 남용.df['col'] + df['col2']을 사용해야 속도가 빠르다.위의 지연 요소들은 파이썬의 연산 처리 속도 저하에 영향을 주기 때문에
가능한 한 지양하는 것이 좋다.