让我们做一个实验来的str.find()
到re.search()
速度比较:
import timeit
setup = '''
import urllib2
import re
start = "<body>"
end = "</body>"
url = 'http://www.stackoverflow.com'
req = urllib2.urlopen(url)
res = req.read()
regex = re.compile('%s.+?%s' % (start, end))
'''
timeit.timeit('''res[res.find(start):res.find(end)]''',
setup = setup, number = 1000)
timeit.timeit('''res[res.find(start):res.rfind(end)]''',
setup = setup, number = 1000)
timeit.timeit('''regex.search(res)''',
setup = setup, number = 1000)
有了这个,我们得到:
0.16357661195633
0.08454644330907968
0.2768974693601649
所以看起来str.find()
有一个相当不错的速度,但如果你知道你的最终报价将是更接近比年初就可以加快速度与str.rfind()
结束。
你可以做的另一件事是使用多线程。启动一个不断获取URL并将它们放入队列的线程,然后让另一个线程处理Queue。这样,当第一个线程在等待IO时睡眠时,第二个线程将处理前一个URL中的字符串。东西大致沿着这些线:
import Queue
import threading
import urllib2
q = Queue.Queue()
results = []
url = 'http://www.google.com/'
start = '<body>'
end = '</body>'
def get_urls():
while 1:
req = urllib2.urlopen(url)
res = req.read()
print "putting data len", len(res)
q.put(res)
def process_url():
url_data = q.get()
result = url_data[url_data.find(start):url_data.find(end)]
results.append(result)
q.task_done()
putter_thread = threading.Thread(target = get_urls)
getter_thread = threading.Thread(target = process_url)
putter_thread.start()
getter_thread.start()
来源
2014-02-10 05:03:58
GVH
如果服务器只会让你每隔一段时间运行一次,它真的需要多快? –
我会试着找出服务器的速率限制,但在客户端我也想更快地进行解析。我的意思是像华尔街一样快速。 – paranoidhominid
该网站是否有API?也许你可以获得价值,而无需拉动整个页面。 –