2013-02-26 4 views
9

정수 목록을 담은 거대한 텍스트 파일을 읽고 싶습니다.Python에서 입력을 읽는 가장 빠른 방법

G = [] 
with open("test.txt", 'r') as f: 
    for line in f: 
     G.append(list(map(int,line.split()))) 

그러나, 그것은 (timeit를 통해) 약 17 초 소요 : 지금 나는 다음과 같은 일을 해요. 이 시간을 줄일 수있는 방법이 있습니까? 어쩌면지도를 사용하지 않는 방법이 있습니다.

+0

목록을 이해하십시오. –

+4

'numpy'를 사용하지 않는 이유가 있습니까? – DSM

+3

"거대한"을 정의하십시오. 또한, 각 라인은 동일한 정수를 가지고 있습니까? –

답변

0

가장 쉬운 속도 향상은 전혀 파일을 (가능한 경우)를 읽어 NOT에 PyPy http://pypy.org/

다음 문제에 대한 이동하는 것입니다. 대신 스트림처럼 처리하십시오.

0

목록 내포는 종종 더 빠릅니다. 그 너머

G = [[int(item) item in line.split()] for line in f] 

, PyPy와 사이 썬과 NumPy와

또한 다음 설정 작업으로 기록을 처리, 대량 삽입을 통해 데이터베이스에 데이터를 가지고 시도 할 수
+0

'G = [f의 줄에 대한 map (int, line.split())'이 빠릅니다. –

+0

@StevenRumbalski이 줄은지도 객체를 생성합니다 :'[<<0x0000000002D28898>의지도 객체, <0x0000000002D28908>의지도 객체, <0x0000000002D289B0의지도 객체>. 그러나 @forivall 라인이 작동합니다. –

+0

@BranAlgue. 아하! 당신은 파이썬 3을 사용하고 있습니다. 그래서'G = [list in map (int, line.split())]에'line for f ''를 변경하십시오. 중첩 목록 이해보다 여전히 빠릅니다. –

0

을 시도합니다. 벌크 삽입 소프트웨어가 이러한 유형의 작업에 최적화되어 있으므로 수행해야하는 작업에 따라 빠를 수도 있습니다.

1

전체적인 파일을 읽기 위해 read()을 사용하는 것은 일반적으로 한 번에 한 줄씩 읽는 것보다 빠릅니다. 메모리에 제약이 없다면, 한번에 전체 파일을 읽은 다음 개행 문자로 데이터를 분할 한 다음 행 목록을 반복합니다.

22

numpy는 기능이 loadtxtgenfromtxt이지만 두 가지 모두 특히 빠릅니다. 널리 분산되어있는 라이브러리에서 사용할 수있는 가장 빠른 텍스트 리더 중 하나는 read_csv 함수입니다 (http://pandas.pydata.org/). 내 컴퓨터에서 라인 당 2 개의 정수를 포함하는 500 만 줄을 읽으려면 numpy.loadtxt으로 약 46 초, numpy.genfromtxt으로 26 초, 1 초 조금 넘는 시간에 pandas.read_csv이 필요합니다.

다음은 결과를 보여주는 세션입니다. (이것은 64 비트. 당신은 여기에서 볼 수없는, 리눅스 우분투 12.04이지만, 파일의 각 읽은 후, 디스크 캐시는 별도의 쉘에서 sync; echo 3 > /proc/sys/vm/drop_caches을 실행하여 삭제되었다.)

In [1]: import pandas as pd 

In [2]: %timeit -n1 -r1 loadtxt('junk.dat') 
1 loops, best of 1: 46.4 s per loop 

In [3]: %timeit -n1 -r1 genfromtxt('junk.dat') 
1 loops, best of 1: 26 s per loop 

In [4]: %timeit -n1 -r1 pd.read_csv('junk.dat', sep=' ', header=None) 
1 loops, best of 1: 1.12 s per loop 
+0

+1, 내가 내 것을 준비하는 동안 대답을 보지 못했습니다. 난 그냥 내 컴퓨터에서 약 16s 소요 OP의 버전을 벤치마킹. 나는 또한'loadtxt'가 느리다는 것에 주목했다. 나는 왜 그것이 더 빠를 것이라고 기대할 수 있을지 모르겠다. (또한 genfromtxt보다 빠르다.) numpy 1.7도 사용합니까? – bmu

+0

@bmu : 예, numpy 1.7을 사용했습니다. –

+2

numpy 문제를 열었습니다. https://github.com/numpy/numpy/issues/3019. 짐작할 수없는 것은,'loadtxt'가 너무 느리다는 것입니다. – bmu

5

pandas하는 numpy을 기반으로 매우 빠른입니다 C 기반 file parser 있습니다

# generate some integer data (5 M rows, two cols) and write it to file 
In [24]: data = np.random.randint(1000, size=(5 * 10**6, 2)) 

In [25]: np.savetxt('testfile.txt', data, delimiter=' ', fmt='%d') 

# your way 
In [26]: def your_way(filename): 
    ...:  G = [] 
    ...:  with open(filename, 'r') as f: 
    ...:   for line in f: 
    ...:    G.append(list(map(int, line.split(',')))) 
    ...:  return G   
    ...: 

In [26]: %timeit your_way('testfile.txt', ' ') 
1 loops, best of 3: 16.2 s per loop 

In [27]: %timeit pd.read_csv('testfile.txt', delimiter=' ', dtype=int) 
1 loops, best of 3: 1.57 s per loop 

그래서 pandas.read_csv 약 10 배 빠른 속도로 당신의 방법보다 데이터를 읽고 약 1과 2 분의 1 초를 취하고있다.

관련 문제