python+mapreduce实现计算pi值

#! /usr/bin/env python 
# -*- coding: utf-8 -*-

'''
1. calc pi by random and map reduce           @2012.02.27

@authors  :   U{peterguo<mailto: [email protected]>}
@copyright:   tencent
@date     :   2012-11-02
@version  :   1.0.0.1
'''

import random
import multiprocessing
from multiprocessing import Process

class CPiMapReduce(object):
    '''
    计算pi的mapreduce类
    '''    
    def __init__(self, map_func, reduce_func, workers_num=None):
        self.map_func = map_func
        self.reduce_func = reduce_func
        self.workers_num = workers_num
        if not workers_num:
            workers_num = multiprocessing.cpu_count()*2
        self.pool = multiprocessing.Pool(workers_num)

    def __call__(self, inputs):
        map_result = self.pool.map(self.map_func, inputs)
        reduce_result = self.reduce_func(map_result)
        return reduce_result

def calculatorMap(*args):
    '''
    简单的map函数
    '''
    #print multiprocessing.current_process().name,' processing'
    points, circle_round = args[0]
    points_in_circle = 0
    for i in range(points):
	    # 这里其实只取了1/4圆
        x = random.random()*circle_round
        y = random.random()*circle_round
        if (x**2 + y**2) < circle_round**2:
            points_in_circle += 1
    print ">", points_in_circle
    return points_in_circle

def count_circle_pointsReduce(points_list):
    '''
    简单的reduce函数,计算
    '''
    print points_list, sum(points_list)
    return sum(points_list)

if __name__ == '__main__':
    CIRCLE_ROUND = 10
    POINTS = 100 #000000
    WORKERS_NUM = 10

    map_reduce = CPiMapReduce(calculatorMap, count_circle_pointsReduce, WORKERS_NUM)
    inputs = [(POINTS/WORKERS_NUM, CIRCLE_ROUND)] * WORKERS_NUM
    print inputs
    
    all_points_in_circle = map_reduce(inputs)   
    
    ac_as = float(all_points_in_circle)/POINTS
    print 'pi approach to:%7f'%(4*ac_as)

你可能感兴趣的:(python+mapreduce实现计算pi值)