2017-10-10 2 views
-2

나는 큰 목록 인 indexes을 가지고 있습니다. 목록의 각 항목은 2 개의 정수를 포함하는 튜플입니다. 정수는 하나의 큰 문자열로 연결하려는 일련의 하위 문자열에 대한 시작 및 끝 인덱스를 나타냅니다.Python - 일련의 문자열을 결합하는 가장 빠른 방법

예를 들어, indexes 목록에 다음과 같이 보이는 2 개의 항목 만있는 경우 : [(1, 5), (10,15)] 색인 위치 1과 5 사이의 문자와 색인 위치 10-15 사이의 문자로 구성된 출력 문자열이 필요합니다. .. IE는이 두 슬라이스를 연결합니다.

좀 더 구체적으로 - 내 주요 문자열은 실제로 많은 수의 16 진수 문자열 버전입니다. 궁극적으로 최종 문자열을 바이너리 버전으로 변환 한 다음 파일에 쓰게 될 것입니다. 현재 내 프로세스는 대용량 데이터 세트에 정말 느리고 다음과 같습니다

def combineFrames(indexes, largeString): 
    ''' 
    input1 = list of all indexes for start/end of substring 
    input2 = the larger String from which the substrings are being pulled 

    returns a single string that consists of all substrings concatenated together... 

    function also generates a new file that consists of the binary version of the concatenated substrings 
    ''' 

    final_string = "" 

    for seq in indexes: 
     final_string += hexString[seq[0]:seq[1]] 

    fullFile = binascii.unhexlify(final_string) 

    with open("d:\\output_File", 'wb') as f: 
     f.write(fullFile) 

    return fullFile 

현재 위는 정말 천천히 나는 그것을 속도를하는 방법이있다 생각한다. 생각?

+1

'정말 느린가'? 어떤 크기의 입력에 대해? 얼마나 빠를까요? 이것에 대한 프로파일을 만들었습니까? – pvg

+0

저는 코딩에 많은 멍청한 반응을 보입니다. 몇 달 동안 만이 작업을 수행 했으므로 다른 옵션이나이를 프로파일하는 방법을 모르겠습니다 ... 질문은 다음을 반복하는 가정 때문에 게시됩니다. 인덱스는 아마도 인덱스를 처리하는 가장 좋은 방법이 아니며 검색하는 동안 다른 방법을 찾을 수 없습니다. 질문을 할 수있는 더 좋은 방법이 있습니까 (나중에 참조 할 것임) – occvtech

+0

대부분이 질문 중 일부를 스스로 해결하려합니다 - 얼마나 빨리 실행됩니까? 입력의 크기/유형은 무엇입니까? 목표는 무엇입니까? 프로파일 링은 시간을 많이 차지하는 코드 부분을 파악하는 데 도움이되지만 초기에는 경과 시간을 측정하는 것이 좋은 시작입니다. 또 다른 좋은 방법은 전체적인 최적화 접근법이 완전히 다른 경우가 있으므로 해결하려는 일반적인 문제를 간략하게 설명하는 것입니다. 일반적으로 모든 성과 관련 작업에 대해, 질문이든 아니든,보다 구체적인 측정 및 목표 일수록 좋습니다. – pvg

답변

4

join을 사용하면 일반적으로 그런 문자열을 연결하는 데 꽤 좋은 방법입니다.

final_string = "".join(hexString[seq[0]:seq[1]] for seq in indexes) 
+0

이것은 각 슬라이스를 반복하는 방식보다 매우 빠릅니다. 고맙습니다. 나에게 갈 시간은 지금 조인 방법에 대한 약간의 독서를한다 :) – occvtech

1

당신 "".join 방법 때문에 :

''.join는, 일반적으로 +를 사용하는 것보다 더 나은 때문에 "는"+ "B"+ "C"같은 수는 다음과 같이 보입니다 또한 중계 문자열 "ab"를 만들고 "abc"만 만들고 ".join ([ 'a', 'b', 'c'])은 직접 'abc'를 만듭니다. 적은 메모리를 사용하고 더 빠릅니다.

관련 문제