4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
1

Sum оптимизиция

08.04.2018, 15:27. Показов 1463. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос такой.
Почему код
Python
1
2
3
x = 0
for q in q_set:
     x += a[i][q] * vw[a[i][q]][q]  * wp[q]
работает за время 0.23 (в некоторых отн. ед-цах).
А тот же код, записанный в виде
Python
1
x = sum(a[i][q] * vw[a[i][q]][q]  * wp[q]  for q in q_set)
работает за время 0.24 (проверял несколько раз, если что).
Конечно, разница во времени не существенная. Просто не понятно, почему sum медленнее, чем обычный цикл for. И как тогда лучше писать?
(там массивы numpy используются, если что)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2018, 15:27
Ответы с готовыми решениями:

Не работает метод sum() в функции
Всем добрый день! Решал задачу по преобразованию из многоуровнего списка в одноуровневый....

Mixed sum
Решите пожалуйста задачу по list-у Mixed sum Write a function that calculates the sum of numbers...

Решение sum задач
2 задание. Было бы хорошо если немного объясните для незнающего.)

Map, filter, sum
Посчитайте сумму квадратов всех двузначных чисел, делящихся на 9. При решении задачи используйте...

Не удается использовать sum()
Нужно, чтобы возвращалось сумма цифр веденного числа, если введено целое число, то возвратить сумму...

8
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
08.04.2018, 16:17 2
Разница будет существеннее, если порядок чисел будет выше. Скажем сложить миллион чисел.
sum - встроенная функция и написана на Си, потому выполняется в native code. А цикл исполняется интепретатором.
Впрочем, реализация sum в numpy многократно эффективнее встроенной.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time
 
start = time.time()
print(sum(i for i in range(100000000)))
end = time.time()
print('Time:',end-start)
 
start = time.time()
x = 0
for i in range(100000000):
    x += i
print(x)    
end = time.time()    
print('Time:',end-start)
 
 
import numpy as np
start = time.time()
print(np.sum(np.arange(100000000),dtype=np.int64))
end = time.time()    
print('Time:',end-start)
Код
4999999950000000
Time: 22.531965255737305
4999999950000000
Time: 27.995893001556396
4999999950000000
Time: 0.9900248050689697
Добавлено через 3 минуты
Цитата Сообщение от spyphy Посмотреть сообщение
Просто не понятно, почему sum медленнее, чем обычный цикл for
Это у вас. У меня sum - быстрее :-)

Добавлено через 1 минуту
И да - если у вас коде массивы numpy - вы вообще не должны использовать никаких циклов и встроенных функций.
Только numpy - только hardcore :-) Иначе все будет медленно.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
08.04.2018, 16:21  [ТС] 3
Цитата Сообщение от Garry Galler Посмотреть сообщение
И да - если у вас коде массивы numpy - вы вообще не должны использовать никаких циклов и встроенных функций.
почти. там только vw словарь dict. поэтому приходится по индексам суммировать.
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
08.04.2018, 16:32 4
Цитата Сообщение от spyphy Посмотреть сообщение
только vw словарь dict.
Перепишите на структуры numpy. Или загоните в pandas DataFrame.
0
dondublon
09.04.2018, 12:12
  #5

Не по теме:

Цитата Сообщение от Garry Galler Посмотреть сообщение
Только numpy - только hardcore :-) Иначе все будет медленно.
:bravo:

0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
11.04.2018, 00:10  [ТС] 6
ок, допустим у меня такой код (или что-то похожее). как его переписать без циклов, используя массивы numpy?
Python
1
2
3
4
5
6
7
for i in range(N):
    for j in range(N):
        for k in range(N):   
            d[k] = a[i,k] + b[k,j]
        min_val = min(d)
        min_ind = np.argmin(d)
        # using min_val and min_ind
Лучшее, что тут получается, это использование генераторов списков:
Python
1
d = [a[i,k] + b[k,j] for k in range(N)]
и в общем это дает некоторый выигрыш по времени.
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
11.04.2018, 01:04 7
Цитата Сообщение от spyphy Посмотреть сообщение
как его переписать без циклов
Я не знаю каковы ваши исходные данные. И какой результат вы хотите получить.
Вам стоит присмотреться к numpy функциями имеющим параметр axis - сейчас вы работаете с данными по сути как с 1D-массивом, однако могли бы предоставить работу с осями numpy вместо их перебора. Все функции numpy векторизованы именно для того, чтобы не использовать python циклы вообще.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
11.04.2018, 02:13  [ТС] 8
Цитата Сообщение от Garry Galler Посмотреть сообщение
Я не знаю каковы ваши исходные данные.
Короче задача такая: нужно i-ю строку матрицы A сложить c j-той строкой матрицей B. Получится одномерный массив. В нем нужно найти минимальный элемент и его номер (индекс).
В принципе я знаю как это с axis написать
Python
1
2
3
4
5
6
7
8
import numpy as np
A = np.matrix([[1,1],[5,2]])
B = np.matrix([[3,4],[1,2]])
i = 1
j = 0
Y = A[i,:] + B[j,:]
res = np.min(Y, axis=1)
ind = np.argmin(Y, axis=1)
Дело в том, что циклами for выглядит проще и работает быстрее, по крайней мере при малых размерах (а большие и не нужны).

Давайте лучше такая задачка. Как переписать это без циклов:
Python
1
2
3
for i in range(N):
    for j in range(N):
        B[i,j] = 0 if A[i,j] == 1 else i
Здесь A, B - просто две матрицы NxN.
Точнее как это сделать, не создавая при этом дополнительных матриц.
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,311
11.04.2018, 04:56 9
Цитата Сообщение от spyphy Посмотреть сообщение
Как переписать это без циклов:
Ну как-то так можно:
Python
1
2
3
N = A.shape[0]
B = np.arange(N).repeat(N).reshape(N, N)
B[A == 1] = 0
0
11.04.2018, 04:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2018, 04:56
Помогаю со студенческими работами здесь

Своя функция sum
Добрый день! Прошу помочь с написанием собственной функции sum. которая должна быть более гибкой,...

Задача 7. Продвинутая функция sum
Доброго времени суток! Помогите пожалуйста решить задачу Напишите свою функцию sum, которая должна...

sum для других операторов
Какой способ лучше выбрать, чтобы написать функцию, подобную sum, но не слагающую элементы, а...

Sum трех квадратов натуральных чисел
Ввести произвольную последовательность натуральных чисел. Вывести, сколько среди них различных...

Вычислить сумму ряда функцией sum
Написать функцию sum, которая вычисляет сумму ряда: S = \sum_{i=1}^{n} 5^i^+^1/2i! Натуральное...

TypeError: sum() missing 1 required positional argument: 'arr'
В этом случае я пытаюсь создать алгоритм для суммирования , сам алгоритм прост у нас есть массив из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru