2015-05-15 1 views
1

Как заменить следующие петли for более эффективным пониманием списка или что-то подобное? Numpy и Pandas не являются опцией, поскольку они не установлены на клиентской системе, но возможно itertools может быть вам полезна?Заменить for-loop на неделе со списком осмысления

n_day_cells  = 24*60/240 
week_matrix  = list() 

for i in range(7): 
    for j in range(n_day_cells): 
     week_matrix.append([i,j,0]) 

EDIT: К сожалению, я должен, возможно, были немного более конкретными. Я на Python 2.7 без других пакетов, кроме «основных» пакетов, таких как itertools. Этот код должен запускать ~ 1M-1B раз в моем скрипте.

+0

Пояснение в списках более кратким, но они не более эффективны, чем базовые для циклов. BTW, лучше сделать 'week_matrix = []', а не 'week_matrix = list()'. –

+1

Это не строгий ответ, но вы можете использовать 'itertools.product':' list (itertools.product (range (7), range (n_day_cells), range (1))) ' – alain

+0

Выполняется ли порядок элементов в' '' week_matrix'''? – wwii

ответ

2

Вы можете сделать это с помощью:

week_matrix = [[i,j,0] for i in range(7) for j in range(n_day_cells)] 

В случае, если ваши диапазоны больше, и вы на python2, вы можете захотеть использовать xrange вместо range, чтобы получить итератор.


Если вы действительно изогнуты по экономии больше времени, используйте xrange, и создать список кортежей, а не список списков (все примеры в python2):

In [3]: %timeit [[i,j,0] for i in range(7) for j in range(n_day_cells)] 
100000 loops, best of 3: 6.51 µs per loop 

In [4]: %timeit [(i,j,0) for i in range(7) for j in range(n_day_cells)] 
100000 loops, best of 3: 4.6 µs per loop 

In [5]: %timeit [(i,j,0) for i in xrange(7) for j in xrange(n_day_cells)] 
100000 loops, best of 3: 4.09 µs per loop 

Последняя выше следует быть самый быстрый вариант, даже если вы хотите использовать его в качестве генератора:

week_matrix = ((i,j,0) for i in xrange(7) for j in xrange(n_day_cells)) 

другого ответа снабженных м ап, хотя интересно, будет иметь больше накладных расходов из-за повторяющихся вызовов на lambda и позвонить в map:

In [6]: %timeit map(lambda x: [x//6, x%6, 0], xrange(n_day_cells*7)) 
100000 loops, best of 3: 10.6 µs per loop 
+2

Если это Python 2. Если это Python 3, то нет 'xrange', поэтому обязательно перейдите в' range'. (Это эффективно, как 'xrange') – adarsh

+0

Как генератор быстрее всего? –

+0

@PadraicCunningham Он должен быть самым быстрым, если OP в порядке с помощью генераторов. В зависимости от требования он может не захотеть использовать генератор и может потребоваться предварительно построенный список. –

1

список сборки с помощью map.

n_day_cells = 24*60/240 
map(lambda x: [x//n_day_cells, x%n_day_cells, 0], xrange(n_day_cells*7)) 

Или одним способом, используя itertools.

import itertools 
a = itertools.imap(lambda x: [x//n_day_cells, x%n_day_cells, 0], xrange(n_day_cells*7)) 

Время будет потребляться, когда требуются значения. Никакая заметная память не будет потреблена.

+0

Чтобы быть эквивалентным, лямбда не должна иметь '' '' '' '* * жестко закодированную *. Если '' 'n_day_cells''', это не сработает. – wwii

+0

@wwii Спасибо, отредактировал это. – wenzul