2015-07-23 2 views
2

У меня есть спектры длин волн как список и некоторое количество других списков, которые я использую в формуле (используя tmm.tmm_core). Есть ли что-то более эффективное, чем повторение длины волны, если я просто в основном делаю то же самое для всех длин волн? Пример Функции вызова в списках

def go(n, thk, theta): 
    #do stuff 
    return(something) 

wv = [1, 2, 3, 4] 
a_vec = [3, 7, 3, 9] 
b_vec = [6, 5, 9, 3] 
c_vec = [0, 1, 8, 9] 
theta = 0 
th = [10, 1, 10] 
final = [] 

for i in range(len(wv)): 
    n = [a[i], b[i], c[i]] 
    answer = go(n, th, theta) 
    final.append(answer) 

в действительности есть, может быть, 5000-10000 строки. Кажется, что немного отстает, когда я нажимаю, и я предполагаю, что это из-за итерации. Довольно новая для оптимизации, поэтому я не использовал никаких инструментов бенчмаркинга или чего-то еще.

+3

Итерация через «диапазон» вообще не стоит дорого. Возможно, понимание списка будет быстрее, чем добавление в список постоянно, но, вероятно, большая часть причин, по которым он медленный, объясняется тем, что делает 'go'. Попробуйте [profiling] (https://docs.python.org/2/library/hotshot.html) свой код, чтобы узнать, что происходит на самом деле. – Claudiu

+0

На ваш вопрос ответили? –

ответ

1

Вы можете поставить все свои списки в пользовательский список, как C_list и использовать map, чтобы создать новый список all_len содержит длину всех списков затем использовать список понимание, чтобы создать список final:

all_len=map(len,C_list) 
final =[[go([a[i], b[i], c[i]], th, theta) for i in range(li)] for li in all_len] 

Кроме того, если длина a и b и c равны вы можете использовать функцию zip застегнуть затем и отказаться от многократного индексирования:

all_len=map(len,C_list) 
z=zip(a,b,c) 
final =[[go(z[i], th, theta) for i in range(li)] for li in all_len] 
0

Если вам нужно выполнить операцию над каждым элементом в списке, вам придется пройти через каждый элемент в списке. Тем не менее, вы можете получить скорость за счет использования списков: List Comprehensions

1

Я думаю, что вы ищете функцию map в Python!

>>> list1 = [1,2,3,4] 
>>> list2 = [5,6,7,8] 
>>> map(lambda x,y: x+y, list1, list2) 
[6, 8, 10, 12] 

он принимает в функции (в указанном выше случае, анонимную функцию лямбда), один или несколько списков и возвращает другой список. На каждой итерации внутри функции оба списка повторяются, и результат добавляется в новый список. Вам не нужно ограничивать себя выразительной силой заявления лямбда; вы также можете использовать глобально определенные функции, как в нижеследующем случае:

>>> def go(a,b,c): 
...  return a+b+c 
... 
>>> map(go, list1,list2, range(9,13)) 
[15, 18, 21, 24] 
Смежные вопросы