2010-07-02 2 views
3

파이썬을 사용하여 쉼표로 구분 된 문자열을 구문 분석하고 있습니다. 나중에 데이터를 계산하고 싶습니다. 문자열의 길이는 800 자이며 쉼표로 구분 된 120 개의 필드가 있습니다. 120 만 개의 문자열이 처리됩니다.파이썬 빠른 문자열 파싱, 조작

for v in item.values(): 
     l.extend(get_fields(v.split(','))) 
#process l 

get_fields이 전체 동작은 데이터를 반입하는 시간을 제외하고 4-5 분 소요 120

중 20 필드를 추출 operator.itemgetter()를 사용한다. 프로그램의 뒷부분에서이 줄을 sqlite 메모리 테이블에 삽입하여 나중에 사용합니다. 그러나 구문 분석과 목록을 가져 오는 데 4-5 분 정도 소요되는 시간은 내 프로젝트에 좋지 않습니다.

이 처리는 약 6-8 스레드에서 실행합니다.

C/C++로 전환하면 도움이 될 수 있습니까?

+1

당신은 800자를 반복 할 필요가있는 함수를 호출하고 있으며, 당신은 그것을 100 만회 이상 수행하고 있습니다. 컴퓨터 일지라도 처리해야 할 부분이 많습니다. – tlayton

+2

http://docs.python.org/library/csv.html – kennytm

+1

휠 재발발을 계획하고 있다면 다음 게시물을 참조하십시오. http://stackoverflow.com/questions/3055477/how-slow- is-pythons-string-concatenation-vs-str-join 또한 발전기를 살펴 봐야합니다. –

답변

2

프로그램이 1.2M 문자열에 충분한 메모리를 할당하려는 속도가 느려졌을 수 있습니다. 즉, 속도 문제는 문자열 구문 분석/조작 때문이 아니라 l.extend이 원인 일 수 있습니다. 이 hypothsis을 테스트하려면, 당신은 루프에서 인쇄 문을 넣을 수 :

for v in item.values(): 
    print('got here') 
    l.extend(get_fields(v.split(','))) 

인쇄 문이 느린 속도가 느린 얻을 경우

, 당신은 아마 l.extend가 범인입니다 결론을 내릴 수있다. 이 경우 각 줄의 처리를 루프로 옮길 수 있으면 속도가 크게 향상 될 수 있습니다.

추신 : 더 높은 수준의 방식으로 구문 분석을 처리하려면 아마도 csv 모듈을 사용해야합니다. 그러나 속도가 크게 영향을 줄 것이라고 생각하지 않습니다.

+1

timeit 모듈 (http://docs.python.org/library/timeit.html)은 작업 시간을 결정하는 데 도움이 될 수 있습니다. – GreenMatt

+1

눈에 띄는 속도 저하를 볼 수 없다면 메모리 할당이 문제가되지 않기 때문에 빠르고 더러운 방법을 제안했습니다. – unutbu

2

파일 레코드로 사전을로드하고 있습니까? 아마 더 나은 데이터를 직접 처리하는 :

datafile = file("file_with_1point2million_records.dat") 
# uncomment next to skip over a header record 
# file.next() 

l = sum(get_fields(v.split(',')) for v in file, []) 

이는 전체 데이터 구조를 생성 방지 및 get_fields에 의해 반환만을 원하는 값을 축적.