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

Как увеличить скорость

31.05.2022, 20:11. Показов 1717. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Написал код на питоне, ничего особенного создаётся список и потом в него добавляются определённые числа, некоторые умножаются, некоторые возводятся в квадрат, сравниваются и в порядке возрастания записываются в список. Вопрос вот в чём при ограничении расчёта до 1000000 считает 26 секунд, до 10000000 считает 48 минут, а 10 в 15 мне скорее всего не дождаться пока рассчитает, при этом цп загружен на 10%, ОЗУ 35%, можно-ли каким-либо способом увеличить скорость? Может как-нибудь через видяху, наподобии того как майнеры крипту добывают? Подскажите кто в курсе или тут уже ничего не поделаешь как есть так и будет.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2022, 20:11
Ответы с готовыми решениями:

Как увеличить скорость программы
Мне нужно просто немного увеличить скорость работы этой программы a, b, k = map(int, input().split()) if a > b: n = a ...

Как увеличить скорость при работе с большими списками?
задача найти сумму медиан каждой подпоследовательности длины i для всех i=1,n последовательности длины n. я делаю через цикл for, с...

Как можно увеличить скорость программы?
Код в самом внизу. У меня есть матрица размером n x m. В ней нужно найти подматрицу наибольшей площади состоящих из отрицательных...

13
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
31.05.2022, 20:20
Чаще всего в алгоритме проблема.
Если только арифметические операции, то есть библиотека numpy...
А в общем, без задачи с условиями толку мало...
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
31.05.2022, 20:26
sega333, попробуйте оценить число операций как О(?)

Это даст понимание что можно и что нельзя ожидать от усилий ускорения.
Например, если у вас О(en!), то все печально независимо от вложений в ускорение.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
01.06.2022, 12:55
Цитата Сообщение от sega333 Посмотреть сообщение
список и потом в него добавляются определённые числа, некоторые умножаются, некоторые возводятся в квадрат, сравниваются и в порядке возрастания записываются в список.
Записываются в список. А список сортированный? А если да - то это используется?
Если у вас есть хоть один вызов list.index - это очень плохо.
0
0 / 0 / 0
Регистрация: 31.05.2022
Сообщений: 12
07.06.2022, 21:00  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
Чаще всего в алгоритме проблема.
Если только арифметические операции, то есть библиотека numpy...
А в общем, без задачи с условиями толку мало...
Вот задача.
Множитель 10, дельта -3, +3. При условии что полученное число меньше 1-го числа в списке vse, то когда -3 полученное число записывается в список chislo, возводится в квадрат и записывается в список vse, так-же это число умножается на 2, затем на 4 и записывается в список vsedop, когда +3 полученное число записывается в список chislo, возводится в квадрат и записывается в список vse, так-же это число умножается на 4, затем на 2 и записывается в список vsedop.
Если полученное число больше или равно 1 числу в списке vse, то к этому числу прибавляется первое число из списка vsedop и ставится в список vse в порядке возрастания, в список vsedop с таким-же индексом переносятся 1-е два числа и меняются местами (что-бы в следующий раз брать второе число). В списках vse и vsedop первые числа удаляются.

Требуется - получить все числа удовлетворяющие условию до заданного числа и сохранить в фаил. Интересует список chislo, остальные два придумал для выполнения задачи.

Первые два числа ввожу в ручную, что-бы было с чем сравнивать.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import time
startTime = time.time()
 
chislo = [7, 13]
vse = [49, 169]
vsedop = [[14, 28], [52, 26]]
    
 
p = 2
d = int ( input ("Введите конечное число: "))
x = d / 10
m = 1000000
 
while p <= x:
    n = 10 * p - 3
    if n < vse [0]:
        chislo.append (n)
        vse.append (n * n)
        vsedop.append ([n * 2, n * 4])
    else:
        while n >= vse [0]:
            i = vse [0] + vsedop [0] [0]
            v = 0
            while i > vse [v]:
                v = v + 1
            vse.insert (v, i)
            vse.pop (0)
            vsedop.insert (v, vsedop [0] [::-1])
            vsedop.pop (0)
                                     
    n = 10 * p + 3
    if n < vse [0]:
        chislo.append (n)
        vse.append (n * n)
        vsedop.append ([n * 4, n * 2])
    else:
        while n >= vse [0]:
            i = vse [0] + vsedop [0] [0]
            v = 0
            while i > vse [v]:
                v = v + 1
            vse.insert (v, i)
            vse.pop (0)
            vsedop.insert (v, vsedop [0] [::-1])
            vsedop.pop (0)
                                   
    p = p + 1
    if n > m:
        m = m + 1000000
        print (n, time.time() - startTime )
        
print (n, time.time() - startTime)
 
 
with open ('chislo10.txt', 'w') as ch, open ('vse10.txt', 'w') as vs, open ('vsedop10.txt', 'w') as vd:
    ch.write (str(chislo))
    vs.write (str(vse))
    vd.write (str(vsedop))
 
v = len (chislo)
   
print ("Количество чисел составило: ", v)
print ("Затрачено времени: ", time.time() - startTime)
print ("Расчёт окончен.")
Если подскажите как упростить алгоритм буду благодарен.
С numpy попробовал что-то у меня ускорить не получилось, я в питоне толком не разбираюсь может что-то не так делаю.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
07.06.2022, 22:27
Могу подсказать, как увеличить шансы ответа - используйте тэги кода в своих сообщениях.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
09.06.2022, 16:57
Как вариант, работайте с тройками четвёрками чисел

Python
1
2
3
4
5
6
7
8
9
10
11
12
def func1(d):
    ls = [
        (7, 49, 14, 28),
        (26, 169, 52, 26),
    ]
    p = 2
    while p <= d / 10:
        n = 10 * p - 3
        if n < ls[0][1]:
            ls.append((n, n * n, n * 2, n * 4))
        else:
            pass
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
16.06.2022, 11:30
Лучший ответ Сообщение было отмечено sega333 как решение

Решение

по коду тут можно заменить списки на очередь с приоритетом

Python
1
from queue import PriorityQueue
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
16.06.2022, 12:41
Цитата Сообщение от sega333 Посмотреть сообщение
Требуется - получить все числа удовлетворяющие условию до заданного числа и сохранить в фаил. Интересует список chislo, остальные два придумал для выполнения задачи.
Оригинальное условие можно получить?
0
0 / 0 / 0
Регистрация: 31.05.2022
Сообщений: 12
17.06.2022, 20:17  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
по коду тут можно заменить списки на очередь с приоритетом
Почитал про PriorityQueue, мне не подойдёт очередь, там элементы добавляются и удаляются или в начале, или в конце списка, а мне надо вставлять в список в порядке возрастания. Но пока читал наткнулся, на интересную вещь, сам как-то сразу не догодался, что когда элемент в начале списка, меняет своё место или удаляется, то соответственно и весь последующий список меняет свои индексы, пока элементов мало это не актуально, но когда их миллион программа больше занимается переписыванием списка, чем вычислениями.

Переписал программу списки сделал наоборот от большого к малому заработало раз в 10 быстрее!!!

Добавлено через 19 минут
Цитата Сообщение от Red white socks Посмотреть сообщение
Оригинальное условие можно получить?
Требуется получить ряд чисел n.
n1 = p * 10 - 3
n2 = p * 10 +3
p от 1 до 100000000

Условия:
Если n(i) = n1 * n1 - удаляется
Если n(i) = n1 * n1 + n1 * 2 - удаляется
Если n(i) = n1 * n1 + n1 * 2 + n1 * 4 - удаляется
Если n(i) = n1 * n1 + n1 * 2 + n1 * 4 + n1 * 2 - удаляется
Если n(i) = n1 * n1 + n1 * 2 + n1 * 4 + n1 * 2 + n1 * 4 - удаляется
Если n(i) = n1 * n1 + n1 * 2 + n1 * 4 + n1 * 2 + n1 * 4 + ... - удаляется
и так до 1000000000
n(i) сравнивается не только c n1, а со всеми предыдущими n.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.06.2022, 20:26
Цитата Сообщение от sega333 Посмотреть сообщение
а мне надо вставлять в список в порядке возрастания
видимо ты не то читал. очередь с приоритетом именно это и делает.

Python
1
2
3
4
5
6
7
8
9
from queue import PriorityQueue
 
q = PriorityQueue()
q.put(1)
q.put(5)
q.put(3)
q.put(2)
while q.qsize() > 0:
    print(q.get())
Добавлено через 3 минуты
Цитата Сообщение от sega333 Посмотреть сообщение
Условия:
а есть нормальное условие задачи?
2
0 / 0 / 0
Регистрация: 31.05.2022
Сообщений: 12
20.06.2022, 16:15  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
видимо ты не то читал. очередь с приоритетом именно это и делает.
Написал код вместо списков сделал очередь с приоритетом. Программа полетела, но возникла другая проблема даже до 1000000000 рассчитать не получилось, не хватило оперативки. Проблема заключается в том, что пришлось переделать алгоритм. В списках у меня 3 списка 1 - все n которые не подпадают под исключения, 2 - n. с которыми сравниваю, 3 - n * 2, n * 4 - это те числа которые я добавляю к числу из второго списка (когда появляется исключение). Т.е. у каждого n. из 2 списка свои n * 2, n * 4 из 3 списка и они с тем-же индексом что и n., когда к n. добавляю n * 2 или n * 4, то новое n. ставится в порядке возрастания во 2 список, а n * 2, n * 4 меняются местами и с тем-же индексом что и n. ставятся в 3 список.
В очереди так не получается поэтому приходится сразу высчитывать все n. и добавлять их в очередь т.е. n1 = 7 заносим в список, затем все результаты с n1 заносим в очередь n1 * n1 = 49, 49 + n1 * 2 = 63, 63 + n1 * 4 = 91, 91 + n1 * 2 = 105, 105 + n1 * 4 = 133 и так до 1000000000, затем n2 = 13, n2 сравниваем с самым маленьким из очереди это 49 - n2 меньше, n2 заносим в список, затем все результаты с n2 заносим в очередь n2 * n2= 169, 169 + n2 * 2 = 195, 195 + n2 * 4 = 247, 247 + n2 * 2 = 273, 273 + n2 * 4 = 325 и так до 1000000000, и так со всеми n3, n4 ... n(i), n10 = 53, n10 сравниваем с самым маленьким из очереди это 49 - n10 больше, 49 удаляем из очереди n10 в список не заносим, затем n11 = 57, n2 сравниваем с самым маленьким из очереди это уже не 49, а 63 - n11 меньше, n11 заносим в список, затем все результаты с n11 заносим в очередь n11 * n11= 3249, 3249 + n11 * 2 = 3363, 3363 + n11 * 4 = 3591, 3591 + n11 * 2 = 3705, 3705 + n11 * 4 = 3933 и так до 1000000000.
Вот как-то так выглядит алгоритм представляете сколько чисел надо что-бы было в оперативке. А в том алгоритме чисел намного меньше на одно n. одно число во 2 списке и два числа в 3 списке.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
20.06.2022, 16:49
ты бы условие своей задачи написал.
что дано? что нужно вывести?
0
0 / 0 / 0
Регистрация: 31.05.2022
Сообщений: 12
22.06.2022, 16:29  [ТС]
Вопрос решён!!! Всем огромная благодарность, особенно eaa, за подсказку
Цитата Сообщение от eaa Посмотреть сообщение
по коду тут можно заменить списки на очередь с приоритетом
.

Всё решилось просто по своему не знанию я решил, что в очередь можно добавлять только отдельные элементы, а оказывается, что можно добавлять ещё и списки. Я пишу n. * n., затем n. * 2, затем n. * 4, а списки ставятся в очередь в порядке возрастания по первому числу в списке. А потом к первому числу, когда надо, я прибавляю по очереди n. * 2, n. * 4. Вот и всё!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2022, 16:29
Помогаю со студенческими работами здесь

Как увеличить скорость опроса веб морды?
В чём суть, есть несколько IP камер, и нужно следить за тем чтоб они находились в сети. Было принято решение просто либо пинговать их либо...

Увеличить скорость кода
Есть вот такой код: x = input() line = input() count = 0 n = -1 while '&gt;&lt;' in line: n = line.count('&gt;&lt;') line =...

Улучшить производительность и увеличить скорость загрузки-выгрузки файлов
Добрый день, программисты) Есть код бота Телеграм, который ждет запроса от пользователя, скачивает и отправляет аудио пользователю. ...

Как увеличить скорость Wi-Fi?
Добрый день, прошу совета. Провайдер - мгтс, тариф разгони вай-фай, 150 мбит/с, новый роутер (без внешних антенн), который вещает на...

Как увеличить скорость Wi-Fi?
Как увеличить скорость Wi-Fi? Имеется интернет 70мбит\сек. Имеется собственно сам Wi-Fi роутер Neatgear WNR2200. Подключен Моноблок...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru