Я ещё тестов подогнал, пусть asilyator помедетирует, почему его любимые треды выпоняют задачу медленее, чем последовательный запуск этой задачи несколько раз. Хочется услышать его комментарии.
import threading
import urllib
import html5lib
import time
def main():
print 'Fetching ixbt.com front page'
data = urllib.urlopen('http://ixbt.com/').read()
limit = 5
print 'Building %d trees without threads' % limit
start = time.time()
for x in xrange(limit):
tree = html5lib.parse(data, treebuilder='lxml', namespaceHTMLElements=False)
assert 'iXBT.com' in tree.xpath('//title/text()')[0]
print 'Time: %.02f' % (time.time() - start)
print 'Building %d trees using %d threads' % (limit, limit)
def worker():
tree = html5lib.parse(data, treebuilder='lxml', namespaceHTMLElements=False)
assert 'iXBT.com' in tree.xpath('//title/text()')[0]
start = time.time()
pool = []
for x in xrange(limit):
t = threading.Thread(target=worker)
t.start()
pool.append(t)
for t in pool:
t.join()
print 'Time: %.02f' % (time.time() - start)
if __name__ == '__main__':
main()
Результаты выполнения:
lorien@athlon:/tmp$ python tt.py
Fetching ixbt.com front page
Building 5 trees without threads
Time: 4.30
Building 5 trees using 5 threads
Time: 7.59
Для тестов специально использована мега-тормозная html5lib библиотека, с которой работает asilyator.
Итого хотелось бы услышать от asilyator:
1) Зачем он использует html5lib которая на два порядка медленее lxml
2) Как он объяснит то, что пять тредов работают медленнее, чем просто запуск функции пять раз подряд.