파이썬 버전이 오히려 비효율적이다 (O (1) 대신 O (n) 조회 시간)을 사용하는 것이 좋습니다.
튜플이 set
이거나 문자열이 set
인 대신 사용해보십시오. 두 파일이 서로 다른 구분 기호로 분리 될 수 있기 때문에 튜플이 더 나은 선택이 될 수 있지만 특히 성능 차이가 크지는 않을 것으로 생각됩니다. tuple('something'.split())
은 매우 긴 목록의 멤버십 테스트에 비해 상대적으로 빠릅니다.
또한 inp.readlines()
으로 전화 할 필요가 없습니다. 즉, 당신은 단지
look_up = set(tuple(line.split()) for line in inp)
을 할 수있는 그리고 당신은 tuple(line[:3])
보다는 [line[0], line[1], line[2]]
가 아닌 다른 코드의 다른 부분을 변경하지 않고도 상당한 속도 향상을 볼 수 있습니다. 사실
은 GREP 및 배쉬는 ...이 꽤 완벽한 (테스트되지 않은,하지만 작동합니다.)
while read line
do
grep "$line" "file2.txt"
done < "file1.txt"
한 빨리 어떤 확인하려면, 우리가 할 수 generate some test data (~ file1.txt
에서 4500 키와 1000000 lines in file2.txt
), 벤치마킹 같은 python 버전의 간단한 (대략 ... grep 버전과 다른 순서로 행이 인쇄됩니다.)
[email protected]:~/so> time sh so_temp149.sh > a
real 1m47.617s
user 0m51.199s
sys 0m54.391s
대 :
with open('file1.txt', 'r') as keyfile:
lookup = set(tuple(line.split()) for line in keyfile)
with open('file2.txt', 'r') as datafile:
for line in datafile:
if tuple(line.split()[:3]) in lookup:
print line,
파이썬 버전은 ~로 70 배 빠른 밝혀물론
[email protected]:~/so> time python so_temp149.py > b
real 0m1.631s
user 0m1.558s
sys 0m0.071s
는 두 가지 예는 완전히 다른 방법으로 문제를 접근하고있다. 우리는 두 가지 알고리즘을 비교하고 있으며 두 가지 구현을 비교하지 않았습니다. 예를 들어, file1
에 두 개의 핵심 행만있는 경우 bash/grep 솔루션이 쉽게 승부를가집니다.
(bash에는 멤버쉽에 대한 O (1) 조회가있는 일종의 컨테이너가 내장되어 있습니까? (배쉬 4에는 해시 테이블이있을 수 있지만 그것에 대해 아무것도 알지 못합니다 ...)) ...뿐만 아니라, bash는 위의 파이썬 예제와 유사한 알고리즘을 구현하려고 흥미
"다소 큰"크기는 어느 정도입니까? 메가 바이트? 기가 바이트? 테라 바이트? –
나는이 질문에 대한 답을 얻고 답변을 얻으 려 할 때 장기간의 시도가 끝날 수 있었는지 궁금 할 것입니다. 일회성 문제의 경우 최적의 솔루션이 아니더라도 가장 쉬운 솔루션이 가장 좋은 경우가 많습니다. –
@ Mark - 장거리 달리기 시도가 16 개의 작업으로 분할되어 클러스터에 배치되었습니다. 나중에 6 시간은 아직도 달리고있다! Eeek! –