lundi 16 mai 2016

Speed up passing plate (random walker) code

How cold you speed up the following code to be able to do more than 100 individuals?

""" Random Walker """
import numpy as np
import scipy as sp
import random as rd
import time
def procedure():
time.sleep(2.5)
t0C = time.clock()
t0 = time.time()

"""Definitions"""

def ifilterfalse(predicate, iterable):
# ifilterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
if predicate is None:
    predicate = bool
for x in iterable:
    if not predicate(x):
        yield x

def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
# unique_everseen('ABBCcAD', str.lower) --> A B C D
seen = set()
seen_add = seen.add
if key is None:
    for element in ifilterfalse(seen.__contains__, iterable):
        seen_add(element)
        yield element
else:
    for element in iterable:
        k = key(element)
        if k not in seen:
            seen_add(k)
            yield element

"""Creating the Random Walk"""

n=int(input('Number of Individuals at Table: '))
iters=10000
final=np.zeros(n)
total=0
for j in xrange(iters):
    d=np.array([0])
    i=0
    while i<1:
        new=d[len(d)-1]+rd.choice([-1,1])
        if new<0:
        new+=n
        elif new>=n:
            new-=n
        d=np.append(d,new)
        dshort=list(unique_everseen(d))
        if len(dshort)>=n:
            i=1
        last=dshort[len(dshort)-1]
        length=len(d)
    final[last]+=1
    total+=length

final=np.round(final/iters,4)
total=round(total/iters,3)

"""Writing To A File"""

print (40 * '-')
print (" ")
print ("   Percentages: ")
print (" ")
print ("   S#:"+"      S#:".join(map(str,range(n))))
print ("   "+"%   ".join(map(str,final))+"%")
print (" ")
print ("   Average Number of Passes of Plate: {}".format(total))
print (" ")
print (40 * '-')
# measure process time

procedure()
print time.clock() - t0C, "seconds process time"

 # measure wall time

procedure()
print time.time() - t0, "seconds wall time"

right now for the case of 10 individuals the time is:

5.877529 seconds process time

12.9134569168 seconds wall time

The problem is that when the number of individuals(100, 1000) increases the code is too slow, any suggestions?




Aucun commentaire:

Enregistrer un commentaire