Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173

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

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

Студворк — интернет-сервис помощи студентам
Вопрос такой.
Почему код
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.04.2018, 15:27
Ответы с готовыми решениями:

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

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

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

8
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.04.2018, 16:17
Разница будет существеннее, если порядок чисел будет выше. Скажем сложить миллион чисел.
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)
Code
1
2
3
4
5
6
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  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
И да - если у вас коде массивы numpy - вы вообще не должны использовать никаких циклов и встроенных функций.
почти. там только vw словарь dict. поэтому приходится по индексам суммировать.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.04.2018, 16:32
Цитата Сообщение от spyphy Посмотреть сообщение
только vw словарь dict.
Перепишите на структуры numpy. Или загоните в pandas DataFrame.
0
09.04.2018, 12:12

Не по теме:

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

0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
11.04.2018, 00:10  [ТС]
ок, допустим у меня такой код (или что-то похожее). как его переписать без циклов, используя массивы 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
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.04.2018, 01:04
Цитата Сообщение от spyphy Посмотреть сообщение
как его переписать без циклов
Я не знаю каковы ваши исходные данные. И какой результат вы хотите получить.
Вам стоит присмотреться к numpy функциями имеющим параметр axis - сейчас вы работаете с данными по сути как с 1D-массивом, однако могли бы предоставить работу с осями numpy вместо их перебора. Все функции numpy векторизованы именно для того, чтобы не использовать python циклы вообще.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
11.04.2018, 02:13  [ТС]
Цитата Сообщение от 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,312
11.04.2018, 04:56
Цитата Сообщение от spyphy Посмотреть сообщение
Как переписать это без циклов:
Ну как-то так можно:
Python
1
2
3
N = A.shape[0]
B = np.arange(N).repeat(N).reshape(N, N)
B[A == 1] = 0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2018, 04:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru