Уведомления

Группа в Telegram: @pythonsu

#1 Июль 2, 2024 04:30:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Если Вы мне поведали про моноширинные шрифты, просветите тогда пожалуйста, что тут (в моём коде) будет функция и как она будет возвращать данные из алгоритма “Поиск” в алгоритм “Запись”.
Вот пример функции “Чтение”
  
import pandas as pd
 
def read_data(ifname):
    data = pd.read_csv(ifname, delimiter=',')
    return data
 
def run_all():
    data = read_data('data.csv')
    print(data)
 
run_all()
Мы зашли в функцию (в алгоритм), прочитали данные из файла, который подан в функцию снаружи, а потом полученные данные вернули обратно из функции в место захода в функцию. Там, в месте вызова функции чтения, эти данные взяли и присвоили переменной, с которой можно дальше работать.

Тут пример
Вычислим сумму квадратов и сумму кубов у двух чисел каких-то
  
>>> def number2(x):
...     return x * x
... 
>>> def number3(x):
...     return x * x * x
... 
>>> n_2_2 = number2(4) + number2(5)
>>> n_3_3 = number3(4) + number3(5)
>>> 
>>> n_2_2
41
>>> n_3_3
189
>>>
Мы делаем одну функцию для вычисления квадрата и одну функцию для вычисления куба. А потом применяем эти функции, чтобы сразу для чисел получать их квадраты и кубы, не выполняя никаких операций (всё делается в функциях неизвестным нам образом). Переменные внутри функций к переменным снаружи функций никак не относятся и могут иметь одинаковые имена.

Если мы перестроим код функции получения куба вот так
  
>>> def number2(x):
...     return x * x
... 
>>> def number3(x):
...     return number2(x) * x
... 
>>> n_2_2 = number2(4) + number2(5)
>>> n_3_3 = number3(4) + number3(5)
>>> 
>>> n_2_2
41
>>> n_3_3
189
>>>
то мы ничего не заметим, потому что функция инкапсулирует свои операции и нам не видно, что внутри неё происходит. Как она там проводит свои операции, мы не знаем; мы только знаем, как её вызывать и что она должна вернуть.

user555
Если Вы мне поведали про моноширинные шрифты, просветите тогда пожалуйста, что тут (в моём коде) будет функция и как она будет возвращать данные из алгоритма “Поиск” в алгоритм “Запись”.
Или такой код вообще не встроить в Ваш пример и нужно прям детально всё разрабатывать под функции?
Код у тебя неправильно сделан. Он сделан, как у новичка. Именно поэтому он не переделывается на отдельные какие-то шаги.

1. Сделай файл CSV для входных данных, которые здесь. Не надо на 700-метровом файле код писать. Это данные, сделанные на время написания кода, чтобы тестировать код было легче и быстрее.
2. Сделай функцию чтения этого файла CSV, выведи на экран полученное содержимое из файла. То есть функция чтения файла только получает данные из файла и возвращает эти данные обратно, а выводит эти данные на экран функция, которая вызывала эту функцию чтения.
3. Сделай пустую функцию поиска, которая принимает данные и возвращает эти же данные обратно.
4. Сделай функцию записи, которая принимает данные и записывает их в файл вывода.
5. Убедись, что данные из входного файла CSV были взяты, выведены на экран, поданы в функцию поиска, возвращены в том же виде из функции поиска и записаны в итоге в выходной текстовый файл в виде простого текста.

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



Отредактировано py.user.next (Июль 2, 2024 04:34:21)

Офлайн

#2 Июль 3, 2024 00:35:40

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

py.user.next
Разобрался (если это так можно назвать) с функциями. Это очень мощный инструмент. Перепишу всё под функции, используя их по максимуму. Сразу сделаю с алгоритмом “Очистка”. Изучу генераторные функции.
Я безусловно в эту ветку еще напишу (если её тут не закроют), как закончу.
Спасибо, что так просто потратили столько своего времени на меня. Вы просто гений.

py.user.next
Незнание языка программирования и неспособность формулировать детерминированные алгоритмы в совокупности чаще всего и приводят к неспособности запрограммировать что-то при полной уверенности, что проблема только в незнании языка.
Прям в точку, прям про меня.
Это мне в будущем сэкономит колоссальное количество времени. И теперь я понимаю, что алгоритм очень важен и нельзя начинать код до выработки детерминированного алгоритма.

Отредактировано user555 (Июль 3, 2024 00:44:16)

Офлайн

#3 Июль 3, 2024 05:07:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Изучу генераторные функции.
Эти функции (генераторные) нужны для оптимизации. Пока кода нет основного, оптимизировать нечего.

Вот пример обычной функции
  
>>> def f():
...     out = []
...     out.append(1)
...     out.append(2)
...     out.append(3)
...     return out
... 
>>> for i in f():
...     print(i)
... 
1
2
3
>>>

Вот пример генераторной функции
  
>>> def g():
...     yield 1
...     yield 2
...     yield 3
... 
>>> for i in g():
...     print(i)
... 
1
2
3
>>>
Делают они одно и тоже, но в обычной функции под список выделяется память. А в генераторной функции нет списка, поэтому и память не надо выделять.

Например, вот такая генераторная функция
  
def loop():
    while True:
        yield 1
 
for i in loop():
    print(i)
бесконечно будет возвращать единицы. При этом память она не потратит вообще, хоть там и бесконечное множество единиц.

Поэтому такими функциями можно обрабатывать 700 мегабайт, при этом эти мегабайты не надо будет в памяти размещать, чтобы с ними работать.


tags: generator function



Отредактировано py.user.next (Июль 3, 2024 05:08:03)

Офлайн

#4 Июль 4, 2024 11:48:09

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

py.user.next
на самом деле там скрывается какой-то пробел в тумане, который ты не заметил
Как выяснилось, не умею я рисовать кошек, получаются стулья без ножек.
Еще раз теперь более внимательно посмотрев свой алгоритм я обнаружил, что не учел особенности работы “выборочного подтверждения” и еще много условий (например длину ложного сегмента данных которую хочу отправить, что бы она тоже попала в окно и был принята клиентом). В реальном трафике нельзя так, просто брать следующий пакет и оценивать его по отношению к размеру окна без слежения за положением “скользящего окна”, потому что пакеты могу поступить в разной последовательности или с повторным передачами.
Например так (разный порядок):
10	0.10	53023	-	100
11 0.11 443 270 -
12 0.12 443 240 -
13 0.13 443 210 -
Или так (повторная передача):
10	0.10	53023	-	100
11 0.11 443 210 -
12 0.12 443 240 -
13 0.13 443 210 -
14 0.14 443 210 -
15 0.15 53023 - 105
16 0.16 443 210 -
Необходимо предусмотреть еще один алгоритм слежения за положением “скользящего окна”, реализованный путём анализа непрерывности последовательностей seq или анализ подтверждений “ACK” (которые я опрометчиво выбросил из данных).
Поэтому я доработаю всё это дело уже самостоятельно.

Я бы хотел спросить еще два вопроса, касаемо оптимизации и скорости выполнения.
py.user.next
Эти функции (генераторные) нужны для оптимизации. Пока кода нет основного, оптимизировать нечего.
Вопроса 1: А если нехватку памяти я не испытываю, это обязательно делать? Или сама процедура выделения памяти занимает значительное время, что может сказаться на скорости выполнении?
Вопроса 2: Если в переделах алгоритма мне необходимо выполнить параллельные вычисления, то как это сделать, что бы оптимизировать скорость выполнения?
Например, есть такой цикл:
  
for i in range(0, 1000):
    if i%2==0:
        summ = 0
        for j in range(i, 1000):
            summ = summ + j
        print(summ, file=open("summ.txt", "a"))
    print(i, file=open("i.txt", "a"))
Как сделать так, что бы цикл i продолжил выполняться, не ожидая завершения расчётов при выполнении условия if? Для цикла i, результаты, полученные при выполнении условия if неважны.
К примеру при соблюдении условия if выполняются какие-то “сложные” расчёты. Я уже чуть-чуть почитал про параллельные вычисления и не понимаю, как правильно распределить вычислительные ресурсы.
Выполнять сразу параллельно все совпадения i%2==0 я же не смогу, правильно? не хватит ресурсов, значит мне надо где-то хранить переменные и как-то их потом подавать для расчётов при высвобождении ресурсов?
И можно ли как-нибудь оценить метрику, сколько то или иное вычисление затратило ресурсов и каких?
Как лучше использовать ресурсы CPU и GPU (я тоже про это почитал, но не понимаю как это работает всё вместе)?
Предполагаю, что это очень сложный и глубокий вопрос, но если Вам не трудно, объясните пожалуйста.

Отредактировано user555 (Июль 4, 2024 19:36:24)

Офлайн

#5 Июль 4, 2024 13:20:26

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Необходимо предусмотреть еще один алгоритм слежения за последовательностью seq или анализ подтверждений “ACK” (которые я опрометчиво выбросил из данных).
Поэтому я доработаю всё это дело уже самостоятельно.
Клиент передает ACK - это номер байта с которого он готов читать дальше данные, соответственно до этого номера остальные он принял, если он будет слать серверу один и тот же ACK, то сервер по идее должен передавать данные с того номера, который ждет клиент, и окно при этом должно уменьшатся, пока клиент не передаст следующий ACK

Офлайн

#6 Июль 4, 2024 17:42:24

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

xam1816
Да, так и есть. Например сервер передаст 1, 2, 3, 4, 5, 6-ю последовательность данных. Клиент получит все, кроме 2 и он пришлёт ack, что ожидает со 2-й последовательности, при этом 3-6-ю последовательность он принял и поместил буфер (опция SACK).
Сервер передаст (к примеру) 7 последовательность и клиент её тоже примет и он пришлёт ack, что ожидает со 2-й последовательности. Потом сервер повторно передаст 2 последовательность и клиент сразу ответит, что ожидает 8 последовательность. Я про этот момент.
xam1816
если он будет слать серверу один и тот же ACK, то сервер по идее должен передавать данные с того номера, который ждет клиент, и окно при этом должно уменьшатся, пока клиент не передаст следующий ACK
Там более сложный алгоритм и окном клиента управляет клиент, а не сервер. Может пакеты теряются по пути и в этом виноват не клиент, а канал передачи данных. Клиент будет уменьшать окно например тогда, когда он не успевает передавать данные приложению и буфер заполняется, т.е пакеты приходят быстрее, чем приложение клиента их успевает их обрабатывать. Об этом он будет сообщать серверу, что бы тот корректировал передачу данных и впустую не слал данные, которые не будут приняты.

Отредактировано user555 (Июль 4, 2024 21:16:02)

Офлайн

#7 Июль 5, 2024 08:22:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Еще раз теперь более внимательно посмотрев свой алгоритм я обнаружил, что не учел особенности работы “выборочного подтверждения” и еще много условий
Ну хорошо, что хоть код писать не начал, а то пришлось бы его выкидывать в итоге. Только опыт написания бы остался. Дикие данные (есть учебные данные, а есть дикие данные) вообще сложно обрабатывать и их сначала надо правильно проанализировать. Потому что в учебных данных всегда всё красиво получается, так как это специально подобранные данные и пройденные человеком (даже если они сложные и находятся в задаче со звёздочкой). Чтобы дикие программы писать, надо опыт набирать на диких программах. Потому что там дикие данные, которые не будут тебя слушаться и могут быть вообще не обрабатываемыми.

user555
py.user.next
Эти функции (генераторные) нужны для оптимизации. Пока кода нет основного, оптимизировать нечего.
Вопроса 1: А если нехватку памяти я не испытываю, это обязательно делать? Или сама процедура выделения памяти занимает значительное время, что может сказаться на скорости выполнении?
Оно не к нехватке памяти приводит, а к паузам. Сначала оно читает из файла и сохраняет в памяти, потом оно читает из памяти, обрабатывает в памяти и сохраняет обработанное в памяти, потом оно читает обработанное из памяти и сохраняет в файл. То есть несколько раз она пишет по 700 мегабайт.

А с генераторами это просто берётся кусочек из файла, проходит через все этапы и оказывается в конечном файле, потом берётся следующий кусочек и так далее. То есть выделять память под 700 мегабайт вообще не нужно, только под маленький кусочек. А сотни мегабайт должны быть только в файле ввода и в файле вывода.

Но пока у тебя тестовые данные, на которых ты пишешь алгоритм, ты с этим не заморачиваешься, потому что и так всё мгновенно будет выполняться, так как тестовые данные небольшие и под них памяти много не надо, они быстро будут размещаться в памяти. А вот когда ты напишешь реализацию и тебе надо будет на этот алгоритм подать реальные данные, тогда и начнутся тормоза, потому реальных данных сотни мегабайт. Поэтому разрабатываешь сначала ты без оптимизаций, чтобы просто всё работало правильно, потому что это тоже непросто сделать. А когда ты сделал и всё работает, тогда можно и оптимизацию провести, переведя простые функции на генераторные функции и переведя списки на генераторы, в тех местах, где это можно сделать (потому что не везде эти преобразования можно проделать).

user555
Вопроса 2: Если в переделах алгоритма мне необходимо выполнить параллельные вычисления, то как это сделать, что бы оптимизировать скорость выполнения?

Как сделать так, что бы цикл i продолжил выполняться, не ожидая завершения расчётов при выполнении условия if?
Если ты не плавал никогда, вообще никогда в воде не оказывался, когда там под ногами ничего нет, а только с берега всегда смотрел, как другие там плавают или просто плескаются, то на твой вопрос “как переплыть реку, ширина которой триста метров?” тебе ответят “не надо этого делать, потому что ты утонешь где-то метров через десять, ещё даже не доплыв никуда, даже до середины реки”. Почему тебе так ответят? Потому что, чтобы уметь плавать, надо это делать постоянно: сначала в ванной, потом в бассейне, потом в озере со стоячей водой, потом в маленькой речке с течением, потом можно плыть до буйков и обратно где-то там, не дальше. То есть надо пройти все эти этапы обучения. И только после этого можно смотреть на реку в триста метров шириной. Но сначала лучше попробовать реку в двадцать метров шириной, а то и с ней может не получиться.

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

Возьми ковшик с водой, полей себе на голову, чтобы просто узнать, что, оказывается, когда вода попадает в глаза, глаза начинает щипать и их надо закрывать, чтобы щипать перестало, и из-за этого ничего не видно становится, и куда плывёшь станет просто не видно. Это первое открытие во время экспериментов с водой. А ещё если в ванной под воду нырнуть, то там дышать становится невозможно и надо как-то выныривать, а то когда воду вдыхаешь, это неприятно как-то. Это второе открытие. И таких открытий там ещё много. С чего ты взял, что ты куда-то поплыть можешь?



Отредактировано py.user.next (Июль 5, 2024 08:37:20)

Офлайн

#8 Июль 5, 2024 11:20:51

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

py.user.next
С чего ты взял, что ты куда-то поплыть можешь?
Это да, я уже понял что мне такие вопросы еще рано задавать. Спасибо.
py.user.next
Ну вот возьми ради интереса к тому, что ты можешь и чего ты вообще не можешь, напиши программу с параллельными действиями (не надо ничего вычислять, просто любое действие), которая вот параллельно делает что-то там в несколько потоков. То есть попробуй написать элементарную программу с параллельными действиями.
Обязательно попробую.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version