programing

open과 io의 차이.이진 스트림의 바이트 IO'

lastcode 2023. 8. 20. 11:14
반응형

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.dat3x를 포함하여 생성됩니다.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

반응형