Interesting timing issue I noticed
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Wed Apr 16 02:44:10 EDT 2008
En Tue, 15 Apr 2008 23:24:01 -0300, Jonathan Shao <jzshao1 at gmail.com>
escribió:
> 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.
First things first: I think you will gain inmensely using NumPy:
http://numpy.scipy.org/
My timings were 62 and 47ms with your code; after I modified it slightly,
39 and 48ms (for the "on3" and "two" functions).
The changes:
- instead of a list of lists, I used a defaultdict with (x,y) as the keys.
That is, instead of matrix[x][y], I use matrix[x,y]
- I converted all range -> xrange
Some lines showing the changes:
# generates a zero matrix
def generate_zero():
import collections
matrix = collections.defaultdict(int)
return matrix
def back_diff_one(back_array, fore_array, box):
diff_array = generate_zero()
start = time.time()
for x in xrange(sizeX):
for y in xrange(borderY):
idx = x,y
diff_array[idx] = back_array[idx] - fore_array[idx]
for y in xrange((sizeY - borderY), sizeY):
idx = x,y
diff_array[idx] = back_array[idx] - fore_array[idx]
for y in xrange(borderY, (sizeY - borderY)):
for x in xrange(borderX):
idx = x,y
diff_array[idx] = back_array[idx] - fore_array[idx]
for x in xrange((sizeX - borderX), sizeX):
idx = x,y
diff_array[idx] = back_array[idx] - fore_array[idx]
Probably most of the time was spent on creating that many range objects in
the inner loops. xrange objects are rather cheap, but you may try
pre-creating them in advance before entering the loops.
Another thing would be to rearrange the loops so the outer one executes
less times; if you know that borderX<<sizeX and borderY<<sizeY it may be
better to swap the inner and outer loops above.
(I assume the above code is just a simplified example, because all the
loops do the same thing and cover the whole picture...)
--
Gabriel Genellina
More information about the Python-list
mailing list