какая-либо более быстрая альтернатива?

cost=0
for i in range(12):
    cost=cost+math.pow(float(float(q[i])-float(w[i])),2)
cost=(math.sqrt(cost))

Какая-либо более быстрая альтернатива этому? я - потребность улучшить мой весь код, настолько пробующий для улучшения каждой производительности операторов.

благодарность u

1
задан Dean Harding 10 June 2010 в 05:44
поделиться

3 ответа

В дополнение к общим замечаниям по оптимизации, которые уже сделаны (и под которыми я подписываюсь), существует более "оптимизированный" способ сделать то, что вы хотите: вы манипулируете массивами значений и объединяете их математически. Это работа для очень полезного и широко используемого пакета NumPy!

Вот как это делается:

q_array = numpy.array(q, dtype=float)
w_array = numpy.array(w, dtype=float)
cost = math.sqrt(((q_array-w_array)**2).sum())

(Если ваши массивы q и w уже содержат float, вы можете убрать dtype=float.)

Это почти так же быстро, как может быть, поскольку операции NumPy оптимизированы для массивов. Это также гораздо более разборчиво, чем цикл, потому что он одновременно простой и короткий.

2
ответ дан 2 September 2019 в 23:52
поделиться

Профилировщики полезны ПОСЛЕ того, как вы очистили грубый не очень разборчивый код. Независимо от того, будет ли он выполняться один раз или N миллиардов раз, вы не должны писать такой код.

Почему вы делаете float(q[i]) и float(w[i])? К какому типу (типам) относятся элементы q и `w'?

Если x и y являются плавающей величиной, то x - y тоже будет плавающей величиной, так что это уже 3 явно лишних вхождения float().

Вызов math.pow() вместо использования оператора ** несет накладные расходы на поиск по 'math' и 'pow'.

И так далее

Посмотрите, дает ли следующий код те же ответы, читается ли он лучше и быстрее:

costsq = 0.0
for i in xrange(12):
    costsq += (q[i] - w[i]) ** 2
cost = math.sqrt(costsq)

После того, как вы проверили это и поняли, почему были сделаны изменения, вы можете применить уроки к другому коду Python. Затем, если вам предстоит много работы с массивами или матрицами, рассмотрите возможность использования numpy.

0
ответ дан 2 September 2019 в 23:52
поделиться

Просто подсказка, но обычно реальное улучшение производительности происходит, когда вы оцениваете код на уровне функции или даже выше.

Во время хорошей оценки вы можете обнаружить целые блоки, которые можно выбросить или переписать для упрощения процесса.

0
ответ дан 2 September 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: