len()
은 컨테이너에 포함된 항목의 수를 계산합니다. 다시 말해 문자열일 경우 문자의 길이를 반환하고 컨테이너타입인 튜플, 딕셔너리, 리스트의 경우는 속해있는 값의 개수를 반환합니다.

반면 sys.getsizeof()는 객체의 메모리 사이즈를 바이트 단위로 반환합니다. 객체는 모든 유형이 될 수 있습니다.

파이썬 문자열 객체는 문자 당 1바이트의 간단한 문자 시퀀스가 아닙니다. 특히, sys.getsizeof()함수에는 가비지 컬렉터의 오버헤드(아마 1바이트)가 포함되어 출력됩니다. 

getsizeof()는 object의 __sizeof__ 메서드를 호출하고 object가 가비지 컬렉터에서 관리되는 경우에는 가비지 컬렉터의 오버 헤드를 추가합니다.

예시

# python 3.4
import sys

en = 'a'
ko = 'ㅁ'

print('len()')
print(len(en))
print(len(ko))

# 결과
# 1
# 1

print('encode - utf8')
print(en.encode('utf-8'))
print(ko.encode('utf-8'))


# 결과
# b'a'
# b'\xe3\x85\x81'

print('sys.getsizeof()')
print(sys.getsizeof(''))
print(sys.getsizeof(en))
print(sys.getsizeof(ko))
 
# 결과
# 49
# 50
# 76


len()함수로 알파벳과 한글을 비교하면 길이가 1이 나옵니다. 파이썬3.x는 기본 유니코드를 utf-8로 사용합니다. 따라서 한글이나 다른 문자가 있으면 utf8로 해석을 합니다. 

이 문자열들을 utf-8로 encode하면 바이트 타입으로 변환이되고 알파벳은 1바이트, 한글은 3바이트로 표현이 됩니다.

마지막으로 sys.getsizeof()는 메모리에 실제로 올라가는 크기입니다. ''와 같이 빈 문자열도 49바이트가 차지하게 됩니다.


유니 코드 문자열의 경우 문자 별 크기는 최대 2 또는 4가됩니다 (컴파일 옵션에 따라 다름). Python 3.3 및 이후 버전에서 유니 코드 문자열은 문자열의 내용에 따라 문자 당 1에서 4 바이트를 차지합니다.

+ Random Posts