2014-04-15 3 views
0


그래서 문제는 무엇입니까? 나는 URL리스트를 얻었고 get_text_from_url이라는 마법 함수를 가지고있다 - 그리고 주어진 파일명을 가진 파일에 이것을 써야한다 -이 두 가지 경우는 다른 것보다 낫다. 왜 그런가?
이 경우의 우선 순위는 시간과 메모리로, 읽기 쉽지 않습니다 (미안하지만, 파이썬).
물론 다른 버전도 환영합니다.
첫째 :개방 및 n 번 작성되었거나 n 번 열려 있지만 openning 당 한 번 쓰여 있습니까?

def create_text(filename):   
    delete_current_text(filename) 
    urllist = get_urls() 
    for url in urllist: 
     with open(filename, "a") as file: 
      print >>file, get_text_from_url(url) 


둘째 :

def create_text(filename):   
    urllist = get_urls() 
    with open(filename, "w") as file: 
     for url in urllist: 
      print >>file, get_text_from_url(url) 

답변

2

두 번째 예제는 파일의 열기/닫기 작업에 상당한 오버 헤드가 있고 두 번째 예제는 한 번만 수행 했으므로 두 번째 예제가 더 좋을 것입니다.

def create_text(filename): 
    urllist = get_urls() 
    result = map(get_text_from_url, urllist) 
    with open(filename, "w") as file: 
     file.write("\n".join(result)) 

를 따라서 파일을 하나 개의 쓰기 및 블록 만있다 : (get_text_from_url가 너무 큰 내용을 반환하지 않을 경우)이 같은 결과를 저장하는 경우

그러나, 더 나은해야한다 짧은 시간 동안 (get_text_from_url이 웹 요청을 할 것이라고 가정하면 로컬 파일 쓰기보다 훨씬 많은 시간이 걸립니다).

+0

죄송합니다,하지만 이것은 기계 학습을 목적으로하므로 매핑 할 수 없습니다. 필자의 경우 최대 10MB와 비슷하지만 더 큰 크기의 코드를 사용할 수 있으므로이 코드를 큰 경우에 사용하고 싶습니다. – htzfun

+0

오케이. 그래서 메모리 사용량이 문제라면 두 번째 예제를 고수하겠습니다. –

1

당신이 작업이 완료되면 다음 닫습니다, 파일을 열고 쓰기를 할 경우 I/O가 빨라집니다. 실제로, 당신은 "한 번 열어 쓰기, n"을 쓰고, "n을 쓰고, n을 쓰십시오"(당신이 진술 한대로 "열 n, 한 번 쓰지 않는") 중에서 선택합니다. 후자의 옵션을 사용하면 오픈 당 하나의 쓰기 만하고 있지만 여전히 총 ​​쓰기는 수행하고 있습니다.

+0

질문 제목을 편집했습니다. 한 번 열면 더 좋을거야? 나는 정당화를 요구하고있다. 하지만 어떻게 내부에서 작동 할 것인가? 파일 저장소를 열어 메모리에 저장하거나, 'w'또는 'a'옵션을 사용하는 IO에서 약간의 차이점이 있습니까? 나는 그들 사이의 차이를 이해하지만 IO는 시간과 기억의 의미에서 다르게 작동합니까? – htzfun

+0

@htzfun 일반적으로 우리는 메모리 사용량이 읽기/쓰기 파일과 같은 I/O 비용보다 저렴하다고 가정합니다. 그러나 그렇지 않은 경우 (쓰기 데이터가 너무 크면) 쓰기 대신 스트리밍을 고려하십시오. –

+0

@htzfun 파일을 열면 메모리에있는 파일 설명자가 프로그램에 저장됩니다. 이것은 메모리의 중요하지 않은 양이지만 시간/속도 제약을 고려할 때 걱정하지 않아야합니다. 실제로 두 제안 된 접근 방식 간의 메모리 비용은 크게 다르지 않습니다. 이 둘의 주요 차이점은 파일 열기/닫기가 느리기 때문에 n-open 방식이 훨씬 느려질 것이라는 점입니다. 두 가지 접근법을 쉽게 테스트하고 속도를 비교하여 직접 확인할 수 있습니다. – dano