해당 내용은 Datacamp의 Data engineering track을 정리했습니다.
Writing Efficient Python Code의 chapter 1에 대한 내용입니다.
기본적인 내용보다는 강의를 들으면서 처음 알게 된 내용을 위주로 작성했습니다.
해당 포스팅에는 아래의 내용을 포함하고 있습니다.
- 코스 오버뷰, 효율적인 코드를 위한 조건, 파이썬스러운 코드란 무엇인가?
- Built-in types, functions, modules
- Numpy 라이브러리 특징
1. Welcome !
이번 4강에서는 효율적인 파이썬 코드를 작성하는 방법과 병목현상이 발생하는 부분을 프로파일링하고 불필요한 부분을 제거하는 방법을 배웁니다.
효율적인 파이썬 코드는 어떠한 요소를 갖추고 있어야 할까요? 당연하게도 빠른 런타임과 최소의 메모리를 활용하는 것이 중요한 요소입니다. 흔히 알고 있는 파이썬스러운 코드에는 리스트 컴프리헨션 등이 있습니다. 아래의 코드로 파이썬스러운 코드를 비교해봅시다.
# Non-Pythonic
doubled_numbers = []
for i in range(len(numbers)):
doubled_numbers.append(numbers[i] * 2)
# Pythonic
doubled_numbers = [x * 2 for x in numbers]
위의 예시를 보면 아래처럼 Pythonic한 코드가 좀 더 파이썬의 구조를 의도대로 사용한다고 볼 수 있습니다. 파이썬은 기본적으로 line-by-line으로 계산하는 특징을 가지고 있기 때문에 Pythonic한 코드가 효율적입니다.
앞으로 강의에서는 함수를 사용하는 것과 lambda를 사용하는 방법, 리스트 컴프레헨션 등을 배우게 됩니다.
2. Building with built-ins
파이썬에서 기본적으로 제공하는 타입, 함수, 모듈들은 아래와 같습니다.
- Built-in types
- list, tuple, set, dict, and others
- Built-in functions
- print(), len(), range(), round(), enumerate(), map(), zip(), and others
- Built-in modules
- os, sys, itertools, collections, math, and others
enumerate() 함수는 인덱스와 값을 함께 return 해줄 때 활용합니다. enumerate에서 처음 시작 index값을 변경하고 싶다면, start라는 인수에 원하는 시작 index를 입력해주면 됩니다.
3. The power of NumPy arrays
Numpy는 기본적으로 많이 활용되는 라이브러리입니다. 어떤 특징이 있어서 더 많이 활용되는지 알아봅니다. 기본적으로 Python의 list와 numpy.array는 굉장히 비슷한 기능을 수행합니다. list와 array의 차이점은 2가지정도가 존재합니다. 우선, list는 배열 내부에 다양한 type의 값이 들어올 수 있습니다. 예를 들어 리스트 내부에는 int형과 str이 같이 존재할 수 있습니다. 또한 broadcasting이 존재하지 않습니다. 반면, array는 array 내부의 모든 값이 동일한 타입을 가지며, broadcasting도 지원하고 있습니다.
예를 들어, 어떤 리스트가 존재할 때 각 원소에 대한 제곱 리스트를 구하고 싶다고 가정해보면, 아래와 같은 방법으로 구성할 수 있습니다.
# For Loop
nums = [-2, -1, 0, 1, 2]
sqrd_nums = []
for num in nums:
sqrd_nums.append(num ** 2)
print(sqrd_nums) # [4, 1, 0, 1, 4]
# list comprehesion
nums = [-2, -1, 0, 1, 2]
sqrd_nums = [num ** 2 for num in nums]
print(sqrd_nums) # [4, 1, 0, 1, 4]
# Numpy array
nums_np = np.array([-2, -1, 0, 1, 2])
nums_np ** 2 # array([4, 1, 0, 1, 4])
위의 코드를 봤을 때, 가장 쉽고 편리하다고 느껴지는 코드는 Numpy를 활용한 코드일 것입니다. 또한 더 효율적인 코드이기도 합니다. 위의 방식처럼 계산되는 것이 broadcasting이라고 합니다.
보통 리스트에서는 2D에서 인덱스로 접근할 때, A_list[a][b]를 사용하는 반면, array는 A_list[a, b]로 접근합니다.
추가적으로 Numpy는 boolean으로도 indexing을 할 수 있습니다.
nums = [-2, -1, 0, 1, 2]
nums_np = np.array(nums)
nums_np > 0 # array([False, False, False, True, True])
nums_np[nums_np > 0] # array([1, 2])