On 4/15/08, Daniel Fetchinson <[EMAIL PROTECTED]> wrote:
> > Can I then simply ignore the time data then? I do see better performance
> > obviously the smaller the box is, but I guess my issues is how seriously
> to
> > take all this data. Because I can't claim "performance improvement" if
> there
> > isn't really much of an improvement.
> >
> > On Tue, Apr 15, 2008 at 11:04 PM, Daniel Fetchinson <
> > [EMAIL PROTECTED]> wrote:
> >
> > >  > I've written up a stripped down version of the code. I apologize for
> > > the bad
> > > > coding; I am in a bit of a hurry.
> > > >
> > > > import random
> > > > import sys
> > > > import time
> > > >
> > > > sizeX = 320
> > > > sizeY = 240
> > > > borderX = 20
> > > > borderY = 20
> > > >
> > > > # generates a zero matrix
> > > > def generate_zero():
> > > >     matrix = [[0 for y in range(sizeY)] for x in range(sizeX)]
> > > >     return matrix
> > > > # fills zero matrix
> > > > def fill_matrix(in_mat):
> > > >     mat = in_mat
> > > >     for x in range(sizeX):
> > > >         for y in range(sizeY):
> > > >             mat[x][y] = random.randint(1, 100)
> > > >     return mat
> > > > ######################################################################
> > > > # COMPUTES ONLY A PART OF THE ARRAY
> > > > def back_diff_one(back_array, fore_array, box):
> > > >     diff_array = generate_zero()
> > > >
> > > >     start = time.time()
> > > >     for x in range(sizeX):
> > > >         for y in range(borderY):
> > > >             diff_array[x][y] = back_array[x][y] - fore_array[x][y]
> > > >         for y in range((sizeY - borderY), sizeY):
> > > >             diff_array[x][y] = back_array[x][y] - fore_array[x][y]
> > > >     for y in range(borderY, (sizeY - borderY)):
> > > >         for x in range(borderX):
> > > >             diff_array[x][y] = back_array[x][y] - fore_array[x][y]
> > > >         for x in range((sizeX - borderX), sizeX):
> > > >             diff_array[x][y] = back_array[x][y] - fore_array[x][y]
> > > >
> > > >     # tracks object
> > > >     if (len(box) != 0):
> > > >         for x in range(box[0], box[2]):
> > > >             for y in range(box[1], box[3]):
> > > >                 diff_array[x][y] = back_array[x][y] - fore_array[x][y]
> > > >     print "time one inside = " + str(time.time() - start)
> > > >     return diff_array
> > > > ######################################################################
> > > > # COMPUTES EVERY ELEMENT IN THE ARRAY
> > > > def back_diff_two(back_array, fore_array):
> > > >     diff_array = generate_zero()
> > > >     start = time.time()
> > > >     for y in range(sizeY):
> > > >         for x in range(sizeX):
> > > >             diff_array[x][y] = back_array[x][y] - fore_array[x][y]
> > > >     end = time.time()
> > > >     print "time two inside = " + str(end - start)
> > > >     return diff_array
> > > > ######################################################################
> > > > # CODE TO TEST BOTH FUNCTIONS
> > > > back = fill_matrix(generate_zero())
> > > > fore = fill_matrix(generate_zero())
> > > > box = [20, 20, 268, 240]
> > > > start1 = time.time()
> > > > diff1 = back_diff_one(back, fore, box)
> > > > print "time one outside = " + str(time.time() - start1)
> > > > start2 = time.time()
> > > > diff2 = back_diff_two(back, fore)
> > > > print "time one outside = " + str(time.time() - start2)
> > > >
> > > > Here are some results from several test runs:
> > > >
> > > > time one inside = 0.0780000686646
> > > > time one outside = 0.125
> > > > time two inside = 0.0780000686646
> > > > time two outside = 0.141000032425
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0629999637604
> > > > time one outside = 0.125
> > > > time two inside = 0.0789999961853
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0620000362396
> > > > time one outside = 0.139999866486
> > > > time two inside = 0.0780000686646
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0780000686646
> > > > time one outside = 0.172000169754
> > > > time two inside = 0.0789999961853
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0780000686646
> > > > time one outside = 0.125
> > > > time two inside = 0.0780000686646
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0620000362396
> > > > time one outside = 0.155999898911
> > > > time two inside = 0.0780000686646
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.077999830246
> > > > time one outside = 0.125
> > > > time two inside = 0.077999830246
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0780000686646
> > > > time one outside = 0.171000003815
> > > > time two inside = 0.077999830246
> > > > time two outside = 0.125
> > > > >>> ================================ RESTART
> > > > ================================
> > > > >>>
> > > > time one inside = 0.0629999637604
> > > > time one outside = 0.18799996376
> > > > time two inside = 0.0620000362396
> > > > time two outside = 0.125
> > > >
> > > > Why is a large percentage of the time, the execution time for the
> > > > (ostensibly smaller) first loop is actually equal to or LARGER than
> the
> > > > second?
> > >
> > >
> > > First of all, your method of timing is not the best. Use the timeit
> > > module instead: http://docs.python.org/lib/module-timeit.html
> > >
> > > Second of all the number of subtractions is not that different between
> > > the two variants of your functions. back_diff_one does 75360
> > > subtractions per call while back_diff_two does 76800, these two
> > > numbers are almost the same. It's true that back_diff_one first only
> > > calculates a part of the arrays but after "# tracks object" you do a
> > > bunch of more substractions that will make up the total count.
> > >
> > > HTH,
> > > Daniel
> > >
>
> Please keep the discussion on the list.
>
> Yes, if I were you I would discard your original timing data and redo
> it using the timeit module. Whatever that gives should be reliable and
> you can start from there. In any case your two functions are doing
> roughly the same number of operations.
>
> HTH,
> Daniel
>


BTW, using the following



######################################################################
# CODE TO TEST BOTH FUNCTIONS
back = fill_matrix(generate_zero())
fore = fill_matrix(generate_zero())
box = [20, 20, 268, 240]

def test1( ):
    diff1 = back_diff_one(back, fore, box)

def test2( ):
    diff2 = back_diff_two(back, fore)

if __name__=='__main__':
    from timeit import Timer
    t = Timer("test1( )", "from __main__ import test1")
    print t.timeit( 50 )
    t = Timer("test2( )", "from __main__ import test2")
    print t.timeit( 50 )


and removing all your timing code from the two functions gives

1.63772082329
1.82889485359

which is consistent with your expectation that the version that
computes only a part of the image runs faster. But only marginally,
which is again consistent with the fact that the number of operations
is only marginally different.

HTH,
Daniel
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to