Python: оптимизировать этот цикл - PullRequest
0 голосов
/ 23 октября 2010
a = [(1,2),(3,1),(4,4),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5)]
# Quite a lot tuples in the list, 6 digits~
# I want to split it into rows and columns.
rows = 5
cols = 5

Data structure is
rows and cols are the index for the bit list
[rows, cols, (data)]

Я использую цикл для этого, но это занимает слишком много времени для обработки большого количества кортежей.

processed_data = []
index = 0
for h in range(0, rows - 1):
    for w in range(0, cols - 1):
        li = []
        li = [h, w, a[index]]
        processed_data.append(li)
        index += 1

Эта операция занимает слишком много времени, есть ли способ сделать оптимизацию?Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 23 октября 2010

Хорошо, если вы действительно хотите, чтобы индексы так сильно ...

[divmod(i, cols) + (x,) for i, x in itertools.izip(itertools.count(), a)]
2 голосов
/ 23 октября 2010

Мне не совсем понятно, что вы хотите, но вот фрагмент того же цикла в более оптимизированном виде:

import itertools as it

index = it.count(0) 
processed_data = [[h, w, a[next(index)]] 
                 for h in xrange(0, rows - 1)
                 for w in xrange(0, cols - 1)]

или, поскольку вы уже импортировали itertools,

index = ite.count(0)
indices = it.product(xrange(0, rows-1), xrange(0, cols-1))
processed_data = [[h, w, a[next(index)]] for h, w in indices]

Причина, по которой они быстрее, состоит в том, что они используют списочные выражения вместо for циклов.У списочных представлений есть свой собственный код операции LIST_APPEND, который направляет непосредственно к методу append в создаваемом списке.В обычном цикле for виртуальная машина должна пройти через все процессы поиска метода append в объекте списка, который довольно дорогой.

Кроме того, itertools реализован в C, поэтому, если он не быстрее для того же алгоритма, то в itertools есть ошибка.

0 голосов
/ 23 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...