Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 19, 2016 01:48:33

Pytonist
Зарегистрирован: 2015-05-27
Сообщения: 36
Репутация: +  1  -
Профиль   Отправить e-mail  

Скорость выполнения цикла

Есть код, при выполнении которого производятся вычысления. По количеству входящих данных, ф-я пермутации генерирует много вариантов для вычисления (несколько миллионов). Эта операция (итерации всех вычыслений) длится ооочень долго. Можно как-то ускорить этот процес?
Собственно часть этого куска кода:

res = dict()
amount = [i for i in range(64)]
for i in permutations(amount, select):
    a = list()
    b = list()
    a_sred = list()
    b_sred = list()
    key = i
    for v_a in klass_a:
        for index_a in i:
            a.append(v_a[index_a])
            a_sred.append(klass_a_sred[index_a])
    for v_b in klass_b:
        for index_b in i:
            b.append(v_b[index_b])
            b_sred.append(klass_b_sred[index_b])          
    matrix_a = matrix(a, float) - matrix(a_sred, float)
    matrix_b = matrix(b, float) - matrix(b_sred, float)
    trans_a = transpose(matrix_a)
    trans_b = transpose(matrix_b)
    multiplication_a = matrix_a * trans_a
    multiplication_b = matrix_b * trans_b
    determinant_a = linalg.det(multiplication_a)
    determinant_b = linalg.det(multiplication_b)
    mk = determinant_a + determinant_b
    chk = lk / mk
    res[key] = chk

Отредактировано Pytonist (Фев. 19, 2016 02:03:18)

Офлайн

#2 Фев. 19, 2016 04:52:52

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Офлайн

#3 Фев. 19, 2016 07:48:45

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Скорость выполнения цикла

Pytonist
подобные вычисления надо делать с numpy - у него (насколько я знаю) много где применяются расширения на C, плюс алгоритмы оптимизированные. Встречал высказывания что переход с самописанного питон кода на numpy дает ощутимый выигрыш



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Фев. 19, 2016 08:02:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Скорость выполнения цикла

Pytonist
Можно как-то ускорить этот процесс?
А чего тут ускорять. Насколько я понимаю оно сразу упадет, поскольку lk не определен.

Складывается впечатление что можно ускорить если вы объясните что собственно пробуете посчитать, то будет проще.



Отредактировано doza_and (Фев. 19, 2016 08:02:32)

Офлайн

#5 Фев. 19, 2016 14:02:55

Pytonist
Зарегистрирован: 2015-05-27
Сообщения: 36
Репутация: +  1  -
Профиль   Отправить e-mail  

Скорость выполнения цикла

FishHook
А готовые функции не подойдут?
Собственно здесь используется готовая функция itertools.permutations()
JOHN_16
подобные вычисления надо делать с numpy
numpy используется: matrix(), transpose(), linalg()
doza_and
Насколько я понимаю оно сразу упадет, поскольку lk не определен
К тому моменту, когда начинается выполнение даного куска кода, в переменной “lk” и “select”, “klass_a_sred”, “klass_b_sred” уже есть значения.


Я читал что есть такая штука как PyPy. Кто-то использовал это, в часности с 3й версией Python?

Офлайн

#6 Фев. 19, 2016 20:31:12

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Скорость выполнения цикла

doza_and
если вы объясните что собственно пробуете посчитать
Я просто смотрю на ваш код и не понимаю.
 trans_a = transpose(matrix_a)
    trans_b = transpose(matrix_b)
    multiplication_a = matrix_a * trans_a
    multiplication_b = matrix_b * trans_b
    determinant_a = linalg.det(multiplication_a)
    determinant_b = linalg.det(multiplication_b)
mk = determinant_a + determinant_b
Похоже посчитали детерминанты и только их и используете. Но зачем вам тогда искать A^T.A
С первого курса любого вуза известно det(A.B)=det(A)*det(B), det(A^T)=det(A)
Т.е.
ваш код можно заменить на
    mk = linalg.det(matrix_a)**2+linalg.det(matrix_b)**2
А что вы вцелом делаете неясно. Может вообще все это не надо делать.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version