728x90
반응형
int를 byte로 변환하는 방법
크게 두 가지가 방법이 있습니다.
첫 번째는 to_bytes() 함수를 이용하는 방법입니다. 사용 방법은 다음과 같습니다.
print('to_bytes()')
print((258).to_bytes(2, byteorder="little"))
print((258).to_bytes(2, byteorder="big"))
print((258).to_bytes(4, byteorder="little", signed=True))
#print((-258).to_bytes(4, byteorder="little", signed=False))
#OverflowError: can't convert negative int to unsigned
print((-258000).to_bytes(4, byteorder="little", signed=True))
print((-258000).to_bytes(4, byteorder="big", signed=True))
""" result =>
to_bytes()
b'\x02\x01'
b'\x01\x02'
b'\x02\x01\x00\x00'
b'0\x10\xfc\xff'
b'\xff\xfc\x100'
"""
두 번째는 struct.pack() 함수를 이용하는 방법입니다. 사용 방법은 다음과 같습니다.
print('struct.pack()')
print(struct.pack('<h', 258))
print(struct.pack('>h', 258))
print(struct.pack('<i', 258))
#print(struct.pack('<I', -258000))
#struct.error: argument out of range
print(struct.pack('<i', -258000))
print(struct.pack('>i', -258000))
""" result =>
struct.pack()
b'\x02\x01'
b'\x01\x02'
b'\x02\x01\x00\x00'
b'0\x10\xfc\xff'
b'\xff\xfc\x100'
"""
성능 비교
to_bytes() 함수를 이용하는 방법이 별도의 패키지를 import 하지 않아도 사용할 수 있는 손쉬운 방법이긴 하나, 성능에 차이가 있습니다.
to_bytes() 함수는 이용이 손쉽고 조금 더 직관적이기는 하지만, 성능이 가장 느린 함수로, 오로지 int를 bytes로 변환할 경우라면, struct pack() 함수를 이용하는 것이 성능상으로는 가장 좋습니다.
다음과 같이 "timeit"을 이용하여 두 함수의 성능을 비교하는 코드를 작성하여 실행해 보았습니다.
import timeit
result = timeit.timeit('struct.pack("<H", 25525)', setup='import struct', number=3000000)
print('case 1', result)
result = timeit.timeit('(25525).to_bytes(2, byteorder="little")', number=3000000)
print('case 2', result)
result = timeit.timeit('struct.pack("<I", 25525)', setup='import struct', number=3000000)
print('case 3', result)
result = timeit.timeit('(25525).to_bytes(4, byteorder="little")', number=3000000)
print('case 4', result)
result = timeit.timeit('struct.pack("<Q", 255252552525525)', setup='import struct', number=3000000)
print('case 5', result)
result = timeit.timeit('(255252552525525).to_bytes(8, byteorder="little")', number=3000000)
print('case 6', result)
실행 결과는 다음과 같았습니다.
case 1 0.24562080000000003
case 2 0.29117760000000004
case 3 0.2068852
case 4 0.33815569999999995
case 5 0.29757940000000005
case 6 0.34646350000000004
미미하긴 하지만, to.bytes() 함수보다는 struct.pack() 함수를 이용하는 것이 더 성능이 좋았습니다. 그리고 추가적으로 struct.pack() 함수를 이용하면, 통신 프로그램을 작성할 때, 필요한 구조체 형식의 데이터를 다루는데 아주 적합합니다. 이 부분에 대해서는 다음에 기회가 되면 다시 정리하여 올리도록 하겠습니다.
참고
https://www.delftstack.com/ko/howto/python/how-to-convert-int-to-bytes-in-python-2-and-python-3/
https://docs.python.org/ko/3/library/stdtypes.html
'프로그래밍 > Python' 카테고리의 다른 글
쿼리 결과를 dict, json 형태로 한번에 바꾸는 방법 (0) | 2021.05.19 |
---|---|
[python] str.find()와 str.index() 함수의 차이 (0) | 2021.05.13 |
[Python] 이진 파일로부터 int array 읽어 들이는 3가지 방법 성능 비교 (0) | 2021.04.29 |
[Python] 이진 파일로부터 int array 읽어 들이는 3가지 방법들 (0) | 2021.04.28 |
TypeError: Boolean value of this clause is not defined 해결하기 (0) | 2021.04.27 |