<div dir="ltr"><span style="font-size:12.8px">Hello,</span><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">[Sorry if this is a duplicate. I realized I sent my previous email from the wrong address]<br></span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I am trying to find a way to use scipy/numpy to optimize a piece of code. From profiling I already know over 90% of the runtime of the function is in 4 lines of code. This code is from selSPEA2 in DEAP in case that matters.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>for i in range(N):</div><div>    for j in range(1, size - 1):</div><div>            if sorted_indices[i,j] == min_pos:</div><div>                sorted_indices[i,j:size - 1] = sorted_indices[i,j + 1:size]</div><div>                sorted_indices[i,j:size] = min_pos</div><div>                break</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">The inner loop is inherently parallel since it is each iteration does not depend on any other. With C++ I would use OpenMP or TBB to parallelize the outer loop. </div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">For a more complete picture I have also included the surrounding code. The basic problem is if the number of entries (size) is greater than the number allowed to be kept (k) for the next generation then the most similar items (based on distance) need to be removed until size == k. At each iteration a solution with the lowest distance to another solution is removed and then the distance from the remove solution to all other solutions is set as infinity. This prevents removing all points in a cluster.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Thank you</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>while size > k:</div><div>    # Search for minimal distance</div><div>    min_pos = 0</div><div>    for i in range(1, N):</div><div>        for j in range(1, size):</div><div>            dist_i_sorted_j = distances[i,sorted_indices[i,<wbr>j]]</div><div>            dist_min_sorted_j = distances[min_pos,sorted_<wbr>indices[min_pos,j]]</div><div><br></div><div>            if dist_i_sorted_j < dist_min_sorted_j:</div><div>                min_pos = i</div><div>                break</div><div>            elif dist_i_sorted_j > dist_min_sorted_j:</div><div>                break</div><div>    </div><div>    distances[:,min_pos] = float("inf")</div><div>    distances[min_pos,:] = float("inf")</div><div><br></div><div>    #This part is still expensive but I don't know a better way to do it yet.</div><div>    #Essentially all remaining time in this function is in this section</div><div>    #It may even make sense to do this in C++ later since it is trivially parallel</div><div>    for i in range(N):</div><div>        for j in range(1, size - 1):</div><div>            if sorted_indices[i,j] == min_pos:</div><div>                sorted_indices[i,j:size - 1] = sorted_indices[i,j + 1:size]</div><div>                sorted_indices[i,j:size] = min_pos</div><div>                break</div><div>    </div><div>    # Remove corresponding individual from chosen_indices</div><div>    to_remove.append(min_pos)</div><div>    size -= 1</div></div></div></div>