2013-05-17 2 views
1
def create_file_numbers_old(filename, size): 
    start = time.clock() 
    value = 0 
    with open(filename, "w") as f: 
     while f.tell()< size: 
      f.write((str(value))+'\n') 
      value += 1 

    end = time.clock() 
    print "time taken to write a file of size", size, " is ", (end -start), "seconds \n" 

이것은 최적화해야하는 기능입니다! 누군가 제가 약 3-4 초 안에 그것을 도울 수 있습니까?cProfile을 사용하여 파이를 최적화하는 Python

def main(argv = sys.argv): 
    #add argument checking and parsing here .. 

    fpath = output_path(r"est.txt") 
    size=50*1024*1024  #write a 50M file 
    cProfile.run("create_file_numbers_old('%s', %d)" %(fpath, size)) 
    fpath1 = output_path(r"est1.txt") 
    cProfile.run("create_file_numbers_new('%s', %d)" %(fpath1, size)) 


if __name__ == "__main__": 
    main() 
+0

실제로 I/O에 대해 많이 최적화 할 수는 없지만, 50MB를 쓰는 데 얼마나 오래 걸릴지에 달려있다. 그러나'write()'호출 횟수를 줄이는 것이 좋습니다. 한 번에 둘 이상의 값을 작성한 다음 한도를 초과 할 때이를 자릅니다. 8 바이트 단위로 50MB의 더미 데이터를 쓰는 데 걸리는 시간을 비교하고 전체 문자열을 한 번에 쓰면 작동 여부를 테스트 할 수 있습니다. ('write()'만 타이밍을 둠으로써) – millimoose

+2

또한 들여 쓰기가 명확하게 깨져 있기 때문에 코드 샘플을 확인해야합니다. 미리보기 기능은 친구입니다. 마지막으로 "3 ~ 4 초 내에"다른 사람에게 유용하지 않습니다. 코드가 IO 바운드 인 경우 (가능성이 높음) SSD를 가진 사람이라면 이미 더 빨리 실행될 것입니다. – millimoose

+0

메모리에 버퍼를 생성 한 다음 모든 것을 한 번에 쓸 수는 있지만 이미 어느 정도 버퍼링 될 것입니다. 나는 while 루프가 아마도 최적화 될 수 있다고 생각한다. –

답변

2

.tell()을 호출하면 상당히 저해합니다. 파이썬 공간에 쓰여지는 양을 추적하면 시간을 10 배로 줄일 수 있습니다.

def create_file_numbers_old(filename, size): 
    start = time.clock() 
    value = 0 
    written = 0 # number of bytes written so far 
    with open(filename, "w") as f: 
     while written < size: 
      s = str(value) + '\n' 
      written += len(s) # add how many bytes are in this write() 
      f.write(s) 
      value += 1 

    end = time.clock() 
    print "time taken to write a file of size", size, " is ", (end -start), "seconds \n" 
관련 문제