2012-11-03 4 views
0

이 스크립트는 가능한 데이터가있는 웹 사이트 중 원하는 웹 사이트를 결정합니다. zdata_grabber(item)을 통해 모든 잠재적 인 웹 사이트를 실행하며 모든 유효한 URL의 색인 목록을 반환합니다. 또한 유효하지 않은 웹 사이트의 값은 None입니다.긴 목록의 None 값이 반환되지 않게하려면 어떻게해야합니까?

import requests 

a = range(0, 10) 
b = 'http://www.grandexchangecentral.com/include/gecgraphjson.php?jsid=%r' 

websites = [] 
for i in a: 
    result = b % a[i] 
    websites.append(result) 

def data_grabber(item): 
    url = item 
    r = requests.get(url, headers={'Referer': 'www.grandexchangecentral.com'}) 
    data = r.json 
    if data != None: 
     return websites.index(item) 

z = [data_grabber(x) for x in websites] 
z1 = filter(None, z) 

z1[2, 6, 8]로 단축하는 [None, None, 2, None, None, None, 6, None, 8, None]을 반환합니다. 이 문제는 가능한 웹 사이트 목록이 매우 길어질 수 있으므로 많은 None 자리 표시자를 z에 생성하는 데 몇 분이 걸릴 수 있습니다. 항목을 생성하지 못하도록 z을 만들 수 있습니까? 모든 도움을 미리 감사드립니다.

편집 : 이제 실제로는 대부분 data_grabber입니다. 그래도 이걸 알고 좋은.

+2

Nones의 존재로 인해 실행 시간이 오래 걸린다는 것이 믿기 어려울 것입니다. 병목 현상이 확실한가요? – DSM

+0

현재 병목 현상은 웹 사이트가 상당히 오래 걸리는지 확인하는 방식입니다. 그러나 잠재적 인 웹 사이트 목록은 2 만 개 이상으로 늘어날 수 있으므로 수천 개의 '없음'값을 계산하는 데 몇 분이 걸릴 수 있습니다. –

+1

@ user1709173 네트워크에서 웹 페이지를로드하는 데 비해 상당한 시간이 걸릴 확률은 거의 없습니다. – millimoose

답변

3

@DSM에 동의하는 것은 이것이 당신에게 너무 많은 시간을 들여줄 것 같지 않습니다. 하지만이 것을 방지 할 수 있습니다 :

filter(None, (data_grabber(x) for x in websites)) 

을 이제까지의 None들과 중간 목록을하지 않고 결과 목록을 구축, filter 다음 소모합니다 data_grabber 결과의 발전기를 만들 것 대신 브래킷의 괄호를 사용. 타이밍에 대한 청구의


그냥 테스트 : 다음

>>> %timeit filter(None, [None for x in range(100000)]) 
100 loops, best of 3: 9.22 ms per loop 
정확히

하지 같은 일을하지만,이 100,000 None의 목록을 만들고 내 컴퓨터에 9 밀리 초 단위로 모두 필터링 .

+1

문제가 실제로'websites.index'와 관련되어 있다면 잠시 생각해 보았습니다. - 결국 그것이 무엇을 찾고 있는지 찾아야하고, 피해야 만한다면 정말로 느릴 수 있습니다. -하지만 50k조차도 최악의 경우 30 초 정도 걸립니다. – DSM

관련 문제