open과 io의 차이.이진 스트림의 바이트 IO'
Python에서 스트림 작업에 대해 배우고 있는데 IO 문서에서 다음과 같이 말합니다.
이진 스트림을 만드는 가장 쉬운 방법은 모드 문자열에 'b'가 있는 open()입니다.
f = open("myfile.jpg", "rb")
메모리 내 이진 스트림은 바이트로도 사용할 수 있습니다.IO 개체:
f = io.BytesIO(b"some initial binary data: \x00\x01")
사이의 차이점은 무엇입니까?f
의 정의에 따라open
그리고.f
의 정의에 따라BytesIO
즉, "인메모리 바이너리 스트림"을 만드는 것과 그것이 어떻게 다른가?open
그래요?
단순함을 위해서, 일단 읽기보다는 쓰기를 고려해 봅시다.
그래서 사용할 때open()
다음과 같은 말:
with open("test.dat", "wb") as f:
f.write(b"Hello World")
f.write(b"Hello World")
f.write(b"Hello World")
그 파일을 실행한 다음에test.dat
3x를 포함하여 생성됩니다.Hello World
데이터는 이름으로 보관되지 않는 한 파일에 기록된 후 메모리에 보관되지 않습니다.
이제 당신이 고려할 때io.BytesIO()
대신:
with io.BytesIO() as f:
f.write(b"Hello World")
f.write(b"Hello World")
f.write(b"Hello World")
파일에 내용을 쓰는 대신 메모리 버퍼에 기록됩니다.즉, RAM 덩어리입니다.기본적으로 다음과 같은 내용을 작성해야 합니다.
buffer = b""
buffer += b"Hello World"
buffer += b"Hello World"
buffer += b"Hello World"
with 문을 사용한 예제와 관련하여, 마지막에는 또한 다음이 있을 것입니다.del buffer
.
여기서 중요한 차이점은 최적화와 성능입니다.io.BytesIO
단순하게 모든 데이터를 연결하는 것보다 더 빠른 속도로 데이터를 최적화할 수 있습니다.b"Hello World"
한 사람씩
이를 증명하기 위해 다음과 같은 작은 벤치마크가 있습니다.
- 콘캣: 1.3529초
- 바이트 IO: 0.0090초
import io
import time
begin = time.time()
buffer = b""
for i in range(0, 50000):
buffer += b"Hello World"
end = time.time()
seconds = end - begin
print("Concat:", seconds)
begin = time.time()
buffer = io.BytesIO()
for i in range(0, 50000):
buffer.write(b"Hello World")
end = time.time()
seconds = end - begin
print("BytesIO:", seconds)
성능 향상 외에도, 사용BytesIO
연결하는 대신에 다음과 같은 이점이 있습니다.BytesIO
파일 개체 대신 사용할 수 있습니다.따라서 파일 개체가 쓰기를 기대하는 기능이 있다고 가정합니다.그러면 파일 대신 메모리 내 버퍼를 지정할 수 있습니다.
다른 점은open("myfile.jpg", "rb")
단순히 내용을 로드하고 반환합니다.myfile.jpg
반면에,BytesIO
일부 데이터를 포함하는 버퍼일 뿐입니다.
부터BytesIO
내용을 나중에 파일에 쓰려면 다음 작업을 수행해야 합니다.
buffer = io.BytesIO()
# ...
with open("test.dat", "wb") as f:
f.write(buffer.getvalue())
또한, 당신은 버전에 대해 언급하지 않았습니다; 저는 파이썬 3을 사용하고 있습니다.예와 관련된 내용:전화하는 대신 with 문을 사용하고 있습니다.f.close()
사용.open
하드 드라이브의 파일을 엽니다.사용하는 모드에 따라 디스크에서 읽거나 쓸 수 있습니다.
A BytesIO
개체가 디스크의 실제 파일과 연결되어 있지 않습니다.파일처럼 동작하는 메모리 덩어리일 뿐입니다.반환된 파일 개체와 동일한 API를 가지고 있습니다.open
mode (모드)r+b
이진 데이터의 읽기 및 쓰기 허용).
BytesIO
친한 입니다.StringIO
항상 텍스트 모드에 있음)는 파일 개체가 제공될 것으로 예상되지만 데이터를 직접 전달하고자 하는 API로 데이터를 전달해야 할 때 유용합니다. 있는 입력 를 지고있입데로수에 할 수 .BytesIO
도서관에 주기 전에.한 모든 에서 가져올 수 .BytesIO
사용getvalue()
방법. (일반적으로, 물론 그것들 중 하나만 수행하면 됩니다.)
언급URL : https://stackoverflow.com/questions/42800250/difference-between-open-and-io-bytesio-in-binary-streams
'programing' 카테고리의 다른 글
클릭 시 호출 개체를 가져오는 방법은 무엇입니까? (0) | 2023.08.25 |
---|---|
스택 오버플로는 페이지 다시 로드 없이 서버 측 이벤트를 어떻게 알립니까?Firebug에 요청이 없습니다. (0) | 2023.08.25 |
PHP를 사용하여 단어가 다른 문자열에 포함되어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.08.20 |
왜 익명 함수를 정의하고 jQuery를 인수로 전달합니까? (0) | 2023.08.20 |
INVALID_STATE_ERR: DOM 예외 11 (0) | 2023.08.20 |