[Tutor] Efficiency and speed

James Reynolds eire1130 at gmail.com
Fri Mar 19 17:41:11 CET 2010


Hello all:

I've still been working towards learning the language, albeit slowly and
I've been working on a project that is somewhat intense on the numerical
calculation end of things.

Running 10,000 trials takes about 1.5 seconds and running 100,000 trials
takes 11 seconds. Running a million trials takes about 81 seconds or so. I
don't think 1M trials is needed for accuracy, but 100K probably is.

I've made a few other optimizations today that I won't be able to test until
I get home, but I was wondering if any of you could give some general
pointers on how to make python run a little more quickly.

There are two major pieces of code that seem slow, so I'll share the first
with you. This section takes up about 1/3 of the time used when running all
trials, where trials is 10K or larger.

This section doesn't actually do any math, all it's doing is returning the
"bin" that the randomly generated number falls in.

The second section, the one that is taking up most of the time, does the
math.

The list nx1 is about 220 floating point numbers long.



> sample = random.sample(range(int(self.nx1[b])), trials) # a list of sample
> values based on nx1

countlist = []

self.nx1.append(0) #puts a zero on the end of nx1. This is for the case
> where one of the random values lies past the minimum number (it scales from
> 10M down to almost 0, but not exactly 0) Antyhing past this dates yields a
> 0.

for s in self.mcrange_gen(sample):

         countlist.append(s-1) # This appends the bin number (the number
> returned previously minus one) to make slices of the premium streams.


and here is the generator section:

def mcrange_gen(self, sample):#, lensample):

    lensample = len(sample) # this section is just for speed. All of these
> are renames from the globals to bring calc times down at the expense of
> memory. I haven't tested these yet.

    nx2 = self.nx1

    nx2_append = nx2.append

    nx2_sort = nx2.sort

    nx2_reverse = nx2.reverse

    nx2_index = nx2.index

    nx2_remove = nx2.remove

    for s in range(lensample):

        q = sample[s] #takes the next randomly generated number from the
> sample list

        nx2_append(q) # and appends it to nx list.

        nx2_sort() # and sorts it in place

        nx2_reverse() # reverses the list, because this was the original
> order

        i = nx2_index(q) #get the index of that element

        nx2_remove(q) # and remove the element.

        yield i # send the position of that element back to the main
> program.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100319/c5e4216c/attachment-0001.html>


More information about the Tutor mailing list