2010-03-16 2 views
3

문자열 myStr에 텍스트 파일의 전체 내용 (최소 몇 KB)이 있습니다.파이썬 하위 문자열 추출은 얼마나 효율적입니까?

다음 코드는 메모리에 문자열의 복사본 (첫 번째 문자가 적은)을 생성합니까? 나는 그것을 바라고 있어요

myStr = myStr[1:]

은 같은 내부 버퍼에서 다른 위치를 말합니다. 그렇지 않다면, 이것을하는 더 효율적인 방법이 있습니까?

감사합니다.

참고 : 저는 Python 2.5를 사용하고 있습니다.

+0

@Glenn : 편집 해 주셔서 감사합니다. 나는 항상 제목을 증명하는 것을 잊는다! – Cameron

+3

참고 : 몇 KB는 ** TINY **입니다! –

+0

@Mike : 하, 내가 지나치게 최적화하고있는 것 같아. 로드 된 파일은 _potentially_ 수 있습니다 (이론적으로) -하지만 현재 최대 8KB입니다 :-) – Cameron

답변

4

적어도 2.6의 문자열은 항상 새로운 할당입니다. string_slice()는 PyString_FromStringAndSize()를 호출합니다. 메모리를 재사용하지 않습니다. 불규칙한 문자열로 인해 상대적으로 쉬운 일이되어야하기 때문에 좀 이상합니다.

버퍼 API가 부족하여 (아마도 원하지 않는)이 작업을 더 효율적으로 수행 할 방법이 없습니다.

+1

정보를 제공해 주셔서 감사합니다. 실제로 파이썬 2.5 (내 질문을 업데이트했습니다) 사용하고 있지만 다르게 수행되는 의심. 나는 단지 복제물을 가지고 살아야 할 것이다. (나는 그 캐릭터를 제거해야한다). – Cameron

+1

파일에서 첫 번째 문자를 읽을 수 없으며 문자열에 할당하지 않고 시작할 수 있습니까? 잠깐, 내 대답을 참조하십시오. ** 편집 : ** 대신 benson의 대답을 참조하십시오. – jcdyer

3

대부분의 가비지 수집 언어와 마찬가지로 문자열은 필요한만큼 자주 만들어 지므로 매우 자주 사용됩니다. 그 이유는 설명 된 부분 문자열을 추적하면 가비지 콜렉션이 더 어려워지기 때문입니다.

구현하려는 실제 알고리즘은 무엇입니까? 우리가 조금 더 알고 있다면 더 나은 결과를 얻을 수있는 방법에 대한 조언을하는 것이 가능할 수도 있습니다.

대안으로, 실제로해야 할 일은 무엇입니까? 문자열에 정수 인덱스를 유지하는 것과 같은 다른 방식으로 문제를 볼 수 있습니까? array.array('u')을 사용할 수 있습니까?

f = open("test.c") 
f.read(1) 
myStr = f.read() 
print myStr 

그것은 첫 번째 문자를 건너 뛰고 다음 문자열 변수로 데이터를 읽습니다 :

+0

메모리의 UTF-8 디코딩 된 파일에서 BOM을 제거한 다음이 파일의 내용을 템플릿 엔진 (Jinja2)으로 보낸 다음 결과를 HTML 응답에 씁니다. 방금 템플릿 파일 당 한 번 수행해야 할 방법을 알아 냈으므로 이제는 더 이상 문제가되지 않습니다. – Cameron

1

한 (약간 해키이기는하지만) 솔루션은 다음과 같이 될 것이다.

+0

실제로 첫 번째 문자는 반드시 읽지 않습니다. 첫 번째 문자는 읽을 필요가 없습니다.utf-8로 인코딩 된 파일에서 128 US-ASCII 문자 만 1 바이트로 인코딩됩니다. – tgray

+3

그래서 첫 번째 줄을 읽고 유니 코드로 변환 한 다음 첫 번째 문자를 제거합니다. 위와 같이 진행하면 유니 코드로 변환됩니다. 변환하지 않으면 바이트를 처리합니다. – jcdyer

+0

이 기술을 사용 하겠지만, 파일에서 읽는 순간에는 BOM을 보관해야하는지 여부를 알 수 없습니다. 나중에 (DB에서) 내용을 검색 할 때 전체 파일을 즉시 가져옵니다. 귀하의 기술 버전은 실제로 제가 이전에 요청한 다른 (관련) 질문에 대한 답변으로 이미 내게 제공되었습니다. http://stackoverflow.com/questions/2456380/utf-8-html-and-css-files-with -bom-and-how-to-remove-the-bom-with-python/2456524 # 2456524 – Cameron

1

무엇을하고 있느냐에 따라 적절한 메모리 효율적인 솔루션을 사용해야합니다. (필요한 경우) itertools.islice

+0

쿨, 나는 그 모듈이 존재한다는 것을 몰랐다! – Cameron

+0

잘 찾으면! -'itertools'가 계속 유용합니다. –

관련 문제