В данном случае (множество независимых серверов) скорость и оптимальное количество потоков зависит от канала.
Например, на домашнем ADSL 5Mbit
при 50 - еле дотягивает до 2 url/sec
при 15 - приближается к 4 url/sec
На сервере 100 Mbit
50 - 40-50 url/sec
100 - не дает особого прироста
Если действительно нужна скорость и есть хороший канал, смотрите в сторону асинхронных библиотек.
Вот код на
grequests (под капотом greenlet, gevent, requests)
# -*- coding: utf-8 -*-
import grequests
import time
SIMULTANEOUS = 200
started = time.time()
with open('u.txt', 'r') as f:
urls = f.read().splitlines()
reqs = (grequests.get(url, timeout=10) for url in urls)
for i, resp in enumerate(grequests.imap(reqs, size=SIMULTANEOUS)):
if resp.ok:
print("{0}/{1} {2:.2f}".format(i, len(urls), i/(time.time() - started)))
# Можно делать что-то с resp.content или resp.text
# Нужно учесть, что очередность при imap не соблюдается,
# но есть resp.url А еще можно пользоваться hook'ами (колбэками)
Скорости на канале 100 Mbit:
50 - 50-60 url/sec
100 - ~100 url/sec
200 - ~140 url/sec
Помимо grequests есть scrapy, grab.Spider, tornado и т.п. А если уже много кода на httplib2 и менять не хочется, можно попробовать gevent.