I have a block of code that does the following:
- take the float from the list
b_lstbelow the indexindx - check if this float is between the floating point of the index
iand the next (index i+1) in the lista_lst - if it is, then save it
indxin a sub-list of the third list ( c_lst), where the index of the sub-list is an index of the left in the float a_lst(ie: i) - repeat for all floats in
b_lst
Here is a MWE, which shows what the code is doing:
import numpy as np
import timeit
def random_data(N):
return np.random.uniform(0., 10., N).tolist()
a_lst = np.sort(random_data(1000))
b_lst = random_data(5000)
c = 25
def func():
c_lst = [[] for _ in range(len(a_lst[c:])-1)]
for indx,elem in enumerate(b_lst):
for i in range(len(a_lst[c:])-1):
if a_lst[c+i] < elem <= a_lst[c+(i+1)]:
c_lst[i].append(indx)
return c_lst
print func()
func_time = timeit.timeit(func, number=10)
print func_time
This code works as it should, but I really need to improve its performance, as it slows down the rest of my code.
Add
, . , .
def func_opt():
c_lst = [[] for _ in range(len(a_lst[c:])-1)]
c_opt = np.searchsorted(a_lst[c:], b_lst, side='left')
for elem in c_opt:
if 0<elem<len(a_lst[c:]):
c_lst[elem-1] = np.where(c_opt==elem)[0].tolist()
return c_lst
~ 7 , .
2
np.where:
def func_opt2():
c_lst = [[] for _ in range(len(a_lst[c:])-1)]
c_opt = np.searchsorted(a_lst[c:], b_lst, side='left')
for indx,elem in enumerate(c_opt):
if 0<elem<len(a_lst[c:]):
c_lst[elem-1].append(indx)
return c_lst
130 , .
3
jtaylor, np.searchsorted .tolist():
def func_opt3():
c_lst = [[] for _ in range(len(a_lst[c:])-1)]
c_opt = np.searchsorted(a_lst[c:], b_lst, side='left').tolist()
for indx,elem in enumerate(c_opt):
if 0<elem<len(a_lst[c:]):
c_lst[elem-1].append(indx)
return c_lst
~ 470x , .