
import myutil
import numpy as N
import copy
import itertools
import multiprocessing
import time as T
processes = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=processes)

def IPs():
    """Find inner products of all arrays with themselves"""
    arraySize = (300,200)
    numArrays = 50
    arrayList = pool.map(myutil.my_random,itertools.repeat(arraySize,numArrays))
       
    IPs = N.zeros(numArrays)
    
    startTime = T.time()
    for arrayIndex,arrayValue in enumerate(arrayList):
        IPs[arrayIndex] = myutil.numpy_inner_product(arrayValue)
    endTime = T.time() - startTime
    print 'No shared memory, numpy array multiplication took',endTime,'seconds'
    
    startTime = T.time()
    innerProductList = pool.map(myutil.numpy_inner_product, arrayList)
    IPs = N.array(innerProductList)
    endTime = T.time() - startTime
    print 'Shared memory, numpy array multiplication took',endTime,'seconds'

    startTime = T.time()
    for arrayIndex,arrayValue in enumerate(arrayList):
        IPs[arrayIndex] = myutil.my_inner_product(arrayValue)
    endTime = T.time() - startTime
    print 'No shared memory, my array multiplication took',endTime,'seconds'

    startTime = T.time()
    innerProductList = pool.map(myutil.my_inner_product, arrayList)
    IPs = N.array(innerProductList)
    endTime = T.time() - startTime
    print 'Shared memory, my array multiplication took',endTime,'seconds'
    
    
if __name__ == '__main__':
    print 'Using',processes,'processes'
    IPs()

