Improve the performance of a loop

Q

querypk

What is the fastest way to code this particular block of code below..
I used numeric for this currently and I thought it should be really
fast..
But, for large sets of data (bx and vbox) it takes a long time and I
would like to improve.

vbox = array(m) (size: 1000x1000 approx)
for b in bx:
vbox[ b[1], b[0]:b[2] ] = 0
vbox[ b[3], b[0]:b[2] ] = 0
vbox[ b[1]:b[3], b[0] ] = 0
vbox[ b[1]:b[3], b[2] ] = 0

and vbox is a 2D array
where bx is of form [( int,int,int,int),(........) ]
 
S

Steven Bethard

vbox = array(m) (size: 1000x1000 approx)
for b in bx:
vbox[ b[1], b[0]:b[2] ] = 0
vbox[ b[3], b[0]:b[2] ] = 0
vbox[ b[1]:b[3], b[0] ] = 0
vbox[ b[1]:b[3], b[2] ] = 0

This may not help, but you could try to minimize the number of times you
call b's __getitem__, e.g.:

for b0, b1, b2, b3 in bx:
vbox[b1, b0:b2] = 0
vbox[b3, b0:b2] = 0
vbox[b1:b3, b0] = 0
vbox[b1:b3, b2] = 0

If it helps, I wouldn't expect it to help a lot though. You could also try:

for b0, b1, b2, b3 in bx:
b0_2 = slice(b0, b2)
b1_3 = slice(b1, b3)
vbox[b1, b0_2] = 0
vbox[b3, b0_2] = 0
vbox[b1_3, b0] = 0
vbox[b1_3, b2] = 0

But again, I wouldn't expect dramatic improvements...

STeVe
 
P

Peter Otten

What is the fastest way to code this particular block of code below..
I used numeric for this currently and I thought it should be really
fast..
But, for large sets of data (bx and vbox) it takes a long time and I
would like to improve.

vbox = array(m) (size: 1000x1000 approx)
for b in bx:
vbox[ b[1], b[0]:b[2] ] = 0
vbox[ b[3], b[0]:b[2] ] = 0
vbox[ b[1]:b[3], b[0] ] = 0
vbox[ b[1]:b[3], b[2] ] = 0

and vbox is a 2D array
where bx is of form [( int,int,int,int),(........) ]

You can try

for b0, b1, b2, b3 in bx:
vbox[b1:b3, b0:b2+1:b2-b0] = 0
vbox[b1:b3+1:b3-b1, b0:b2] = 0

By the way, the bottom/right cell of your box remains nonzero. Is that
intentional?

Peter
 
Q

querypk

Actually slicing the way you suggested improved it to some extent. I
did profile on this and I observed that it reduced the number of calls
for __get_item__ and improved the timing to some extent. Which was
useful to some extent.

Thanks again.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top