from random import random from math import pi def mcpi(nsamples): s = 0 for i in xrange(nsamples): x = random() y = random() if x*x + y*y <= 1: s+=1 return 4.*s/nsamples for n in [10, 100, 1000, 10000, 100000, 1000000]: print "%8i" % n, for i in range(3): print "%.5f" % mcpi(n), print %timeit mcpi(1000000) from IPython import parallel rc = parallel.Client() view = rc[:] %loadpy soln/mcpi.py multi_mcpi(view, 10000000) from IPython.parallel.error import RemoteError e0 = rc[0] try: e0.execute("1/0", block=True) except RemoteError as e: if e.ename == 'ZeroDivisionError': print "oops, divided by zero!" else: # unhandled error raise e %loadpy soln/remoteiterhint.py %loadpy soln/remoteiter.py # Slightly modified version of: # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/511509 import heapq def mergesort(list_of_lists, key=None): """ Perform an N-way merge operation on sorted lists. @param list_of_lists: (really iterable of iterable) of sorted elements (either by naturally or by C{key}) @param key: specify sort key function (like C{sort()}, C{sorted()}) Yields tuples of the form C{(item, iterator)}, where the iterator is the built-in list iterator or something you pass in, if you pre-generate the iterators. This is a stable merge; complexity O(N lg N) Examples:: >>> print list(mergesort([[1,2,3,4], ... [2,3.25,3.75,4.5,6,7], ... [2.625,3.625,6.625,9]])) [1, 2, 2, 2.625, 3, 3.25, 3.625, 3.75, 4, 4.5, 6, 6.625, 7, 9] # note stability >>> print list(mergesort([[1,2,3,4], ... [2,3.25,3.75,4.5,6,7], ... [2.625,3.625,6.625,9]], ... key=int)) [1, 2, 2, 2.625, 3, 3.25, 3.75, 3.625, 4, 4.5, 6, 6.625, 7, 9] >>> print list(mergesort([[4, 3, 2, 1], ... [7, 6, 4.5, 3.75, 3.25, 2], ... [9, 6.625, 3.625, 2.625]], ... key=lambda x: -x)) [9, 7, 6.625, 6, 4.5, 4, 3.75, 3.625, 3.25, 3, 2.625, 2, 2, 1] """ heap = [] for i, itr in enumerate(iter(pl) for pl in list_of_lists): try: item = itr.next() if key: toadd = (key(item), i, item, itr) else: toadd = (item, i, itr) heap.append(toadd) except StopIteration: pass heapq.heapify(heap) if key: while heap: _, idx, item, itr = heap[0] yield item try: item = itr.next() heapq.heapreplace(heap, (key(item), idx, item, itr) ) except StopIteration: heapq.heappop(heap) else: while heap: item, idx, itr = heap[0] yield item try: heapq.heapreplace(heap, (itr.next(), idx, itr)) except StopIteration: heapq.heappop(heap) a0 = range(5,20) a1 = range(10) a2 = range(15,25) rc[0]['a'] = a0 rc[1]['a'] = a1 rc[2]['a'] = a2 ra0 = remote_iterator(rc[0],'a') ra1 = remote_iterator(rc[1],'a') ra2 = remote_iterator(rc[2],'a') print 'Merge the local datasets:' print list(mergesort([a0,a1,a2])) print 'Locally merge the remote sets:' print list(mergesort([ra0,ra1,ra2]))