Тестовая реализация алгоритма MapReduce для подсчёта количества ссылок.

Код не претендует на абсолютную правильность, я точно знаю несколько мест, которые можно упростить

# -*- coding: utf-8 -*-
# (c) 2011 Ruslan Popov

import sys, random, json, cStringIO, cProfile

URLS_TOTAL = 1000000
URLS_IN_FILE = URLS_TOTAL / 100

url_variants = ['yandex.ru', 'rambler.ru', 'yahoo.com', 'google.com',
                'twitter.com', 'facebook.com', 'odnoklassniki.ru',]

random.shuffle(url_variants)

def url_generator(limit=1):
    """ Итератор, генерирующий требуемое количество URL. """
    i = 0
    while i  value: # если сохранённое значение больше текущего, то взять текущее
            r_val = value; r_tck = ticks; r_idx = [index]
    return r_val, r_tck, r_idx

def token2dict(token_list):
    """ Преобразуем список токенов в словарь, где ключом является вес. """
    out = {}
    for url, weight in token_list:
        index = weight[0]
        if index in out:
            out[index] = out[index] + [url]
        else:
            out[index] = [url]
    return out

io_pool = [] # список буферов
io_iter = {} # список итераторов для чтения из буферов
cache = {}   # кэш для значений, полученных из буферов

def main():
    print 'Total URLs:', URLS_TOTAL
    print 'Per file:', URLS_IN_FILE
    # разбили данные по блокам в отдельных файлах
    for i in xrange(URLS_TOTAL/URLS_IN_FILE):
        items = sorted(merging(map(mapping, url_generator(URLS_IN_FILE))), key=lambda x: x[0])
        save(items)
        #raw_input('press enter')

    index = xrange(len(io_pool))
    result = []
    while True:
        try:
            value, ticks, index = get_value(index)
            result.append((value, ticks))
        except StopIteration:
            result = map(reducing, result)
            break

    x = token2dict(result)

    print
    for i in sorted(x.keys())[:3]:
        for url in x[i]:
            print i*-1, ':', url

cProfile.run('main()')

sys.exit(0)