Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 24, 2024 13:32:26

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2742
Репутация: +  183  -
Профиль   Отправить e-mail  

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

> Хотелось бы чуть-чуть побыстрее!

Не пробовал через pypy запустить?

> П.С. У меня в целом всё считается, только для расчёта 11 млн. строк у меня затрачивается около 48 часов.

У тебя данные будут где то накапливаться или это только одноразовый расчёт?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#2 Июнь 24, 2024 15:20:58

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

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

user555
Необходимо для каждой строки, в которой значение port1=443 найти разницу во времени между этой и строкой, в которой значение port1 будет равно 443, а разница значений seq не превышает значения CWS.
No.  Time  port1  Seq  CWS
1 0.01 53023 - 50
2 0.02 443 0 -
3 0.03 53023 - 55
4 0.04 443 49 -
5 0.05 53023 - 60
6 0.06 443 100 -
7 0.07 53023 - 70
8 0.08 443 140 -
9 0.09 53023 - 100
10 0.10 53023 - 100
11 0.11 443 210 -
12 0.12 443 240 -
13 0.13 443 270 -
“Разница во времени” - это что? Какого времени?
“разница значений seq” - это что? Каких значений?
“не превышает значения CWS” - это что? Какого значения?

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

Вот эту таблицу на 13 строк возьми и приведи результат конечный, который должен из неё получиться. (Кстати, видишь, да, она ровненькая? Это потому, что я её выравнивал в редакторе с моноширинным шрифтом, а потом вставлял на форум через буфер обмена.)



Отредактировано py.user.next (Июнь 26, 2024 16:30:27)

Офлайн

#3 Июнь 26, 2024 11:48:30

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

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

Rodegast
Не пробовал через pypy запустить?
Нет, не пробовал, но я думаю что py.user.next прав, слишком сложный и плавающий алгоритм.
Я еще раз попробую подробно сформулировать задачу, что бы понятно было.
Rodegast
У тебя данные будут где то накапливаться или это только одноразовый расчёт?
Данные накапливаться не будут. Подал на вход данные, получил вывод значений в файл и дальше работаю с ним. Если я правильно понял вопрос.
py.user.next
(Кстати, видишь, да, она ровненькая? Это потому, что я её выравнивал в редакторе с моноширинным шрифтом, а потом вставлял на форум через буфер обмена.)
Спасибо за подсказу.
py.user.next
Вот эту таблицу на 13 строк возьми и приведи результат конечный, который должен из неё получиться.
Сегодня сделаю, постараюсь подробно объяснить, что бы было понятно.

Отредактировано user555 (Июнь 26, 2024 11:50:44)

Офлайн

#4 Июнь 26, 2024 16:27:29

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2742
Репутация: +  183  -
Профиль   Отправить e-mail  

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

> я думаю что py.user.next прав, слишком сложный и плавающий алгоритм.

Что в нём сложного? В том что я увидел вроде никакой страшной асимптотике нету.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Июнь 26, 2024 16:42:47

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

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

user555
Нет, не пробовал, но я думаю что py.user.next прав, слишком сложный и плавающий алгоритм.
Дело не в алгоритме, а в том, что ты так объясняешь, типа “вон десять домов стоят, мне из них нужны адреса трёх домов только, там они вот рядом стоят которые - вот их адреса нужны, но только вот тех трёх, а не тех, что отдельно стоят”. Каких домов?.. там их по три рядом стоящих можно выбрать n разными способами.

Так что раздели задачу на составляющие части и выражай точно каждую часть без двойных интерпретаций.



Офлайн

#6 Июнь 26, 2024 16:47:51

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

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

Входные данные:

 No.	Time	port1	Seq	CWS
1	0.01	53023	-	50
2	0.02	443	0	-
3	0.03	53023	-	55
4	0.04	443	49	-
5	0.05	53023	-	60
6	0.06	443	100	-
7	0.07	53023	-	70
8	0.08	443	140	-
9	0.09	53023	-	100
10	0.10	53023	-	100
11	0.11	443	210	-
12	0.12	443	240	-
13	0.13	443	270	-
14	0.14	53023	-	105
15	0.15	443	300	-
16	0.16	53023	-	150
17	0.17	443	400	-
18	0.18	443	550	-
19	0.19	53023	-	160
20	0.20	443	650	-
21	0.21	443	670	-
22	0.22	443	700	-
23	0.23	53023	-	170
24	0.24	443	800	-
25	0.25	443	850	-
26	0.26	53023	-	100
27	0.27	443	900	-
28	0.28	443	920	-
29	0.29	53023	-	100
30	0.30	443	940	-
Выходные данные:
 0.02	# значение времени для 2-й строки - разность времени между 4-й строкой и 2-й строкой
0.02	# значение времени для 4-й строки - разность времени между 6-й строкой и 4-й строкой
0.02	# значение времени для 6-й строки - разность времени между 8-й строкой и 6-й строкой
0.04	# значение времени для 8-й строки - разность времени между 12-й строкой и 8-й строкой
0.04	# значение времени для 11-й строки - разность времени между 15-й строкой и 11-й строкой
0.03	# значение времени для 12-й строки - разность времени между 15-й строкой и 12-й строкой
0.04	# значение времени для 13-й строки - разность времени между 17-й строкой и 13-й строкой
0.02	# значение времени для 15-й строки - разность времени между 17-й строкой и 15-й строкой
0.01	# значение времени для 17-й строки - разность времени между 18-й строкой и 17-й строкой
0.04	# значение времени для 18-й строки - разность времени между 22-й строкой и 18-й строкой
0.04	# значение времени для 20-й строки - разность времени между 24-й строкой и 20-й строкой
0.03	# значение времени для 21-й строки - разность времени между 24-й строкой и 21-й строкой
0.03	# значение времени для 22-й строки - разность времени между 25-й строкой и 22-й строкой
0.03	# значение времени для 24-й строки - разность времени между 27-й строкой и 24-й строкой
0.05	# значение времени для 25-й строки - разность времени между 30-й строкой (так как она последняя) и 25-й строкой 
0.03	# значение времени для 27-й строки - разность времени между 30-й строкой (так как она последняя) и 27-й строкой 
0.02	# значение времени для 28-й строки - разность времени между 30-й строкой (так как она последняя) и 28-й строкой 
0	# значение времени для 30-й строки - разность времени между 30-й строкой и 30-й строкой.

Отредактировано user555 (Июнь 26, 2024 19:04:15)

Офлайн

#7 Июнь 26, 2024 18:10:50

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

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

py.user.next
“Разница во времени” - это что? Какого времени?
Разница во времени - Это модуль разности значений полей Time между “I-й” строкой (последовательно берется из набора данных) у которой значение поля port1=443 и “N-й” строкой (неизвестной), в которой port1=443.
При соблюдении условия, что seqN-seqI будет не больше CWS (на момент расчёта значения seqN-seqI, в N-й строке).
Суть объясню ниже.
py.user.next
“разница значений seq” - это что? Каких значений?
Sequence Number (seq) - номер очереди или последовательный номер, показывает порядковый номер пакета при передаче.
Разница значений - модуль разности между seq “I-й” строки и “N-й” строки (неизвестной), в которых port1=443.
Для второй строки начальный номер seq равен 0, т.е для всех остальных строк (с полем port1=443) разность между seqN-seq2 будут означать количество переданных байт.
Например:
разность seq 4-й строки (значение 49) и 2-й строки (значение 0) будет означать, что передано 49 байт данных.
разность seq 6-й строки (значение 100) и 11-й строки (полученное значение 210) будет означать, что передано 110 байт данных.
py.user.next
“не превышает значения CWS” - это что?
CWS - размер буфера в байтах. Размер буфера меняется как в большую, так и в меньшую сторону.
py.user.next
Какого значения?
С этим сложнее, так как оно меняется в каждом расчёте (как в цикле I, так и в цикле N) за ним необходимо следить.

Алгоритм:
Так как количество строк известно, запускаю цикл I (for, счётчик цикла - номер строки).
Беру 1-ю строку (I=1). В первой строке значение port1=53023, значит из неё я извлекаю CWS_1 (размер буфер).
Беру 2-ю строку (I=2), в ней port1=443, для нее мне необходимо выполнить расчёт разности времени между 2-й строкой и N-й (пока неизвестной).
Для I=2 запускаю цикл N (while, счётчик цикла номер строки). Значение N от i+1 до неизвестного. Текущее значение CWS я получил ранее (в i=1), пока оно не измениться все последующие строки буду сравнивать с ним.
Беру 3-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_3 (55).
Беру 4-ю строку: в ней значение port1=443, значит из неё я считаю seq4-seq2=49, CWS на данный момент 55. Проверяю условия seq4-seq2 <= CWS_3 . Условие выполнятся. Продолжаю цикл N.
Беру 5-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_5 (60).
Беру 6-ю строку: в ней значение port1=443, значит из неё я считаю seq6-seq2=100, CWS на данный момент 60. Проверяю условия seq6-seq2 <= CWS_3. Условие не выполнятся. Останавливаю цикл N для I=2.
Беру последнюю строку где условие выполнялось. Считаю разность времени между 4-й строкой и 2-й строкой, получаю значение 0.02, записываю в файл.
Возвращаюсь к циклу I.
Беру 3-ю строку (I=3). В 3-й строке значение port1=53023, значит из неё я извлекаю CWS_3 (60).
Беру 4-ю строку (I=4), в ней port1=443, для нее мне необходимо выполнить расчёт разности времени между 4-й строкой и N-й (пока неизвестной).
Для I=4 запускаю цикл N (while, счётчик цикла номер строки). Значение N от i+1 до неизвестного. Текущее значение CWS я получил ранее (в i=3), пока оно не измениться все последующие строки буду сравнивать с ним.
Беру 5-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_5 (60).
Беру 6-ю строку: в ней значение port1=443, значит из неё я считаю seq6-seq4=51, CWS на данный момент 60. Проверяю условия seq6-seq4 <= CWS_5. Условие выполнятся. Продолжаю цикл N.
Беру 7-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_7 (70).
Беру 8-ю строку: в ней значение port1=443, значит из неё я считаю seq8-seq4=91, CWS на данный момент 70. Проверяю условия seq8-seq4 <= CWS_7. Условие не выполнятся. Останавливаю цикл N для I=4.
Беру последнюю строку где условие выполнялось. Считаю разность времени между 6-й строкой и 4-й строкой, получаю значение 0.02, записываю в файл.
Возвращаюсь к циклу I.


Отредактировано user555 (Июнь 27, 2024 07:00:13)

Офлайн

#8 Июнь 26, 2024 18:21:51

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

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

Rodegast
Что в нём сложного? В том что я увидел вроде никакой страшной асимптотике нету.
Это для Вас нет , а я к сожалению без Вас не могу справиться

Офлайн

#9 Июнь 27, 2024 00:44:01

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

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

user555
Входные данные:
No.	Time	port1	Seq	CWS
1 0.01 53023 - 50
2 0.02 443 0 -
3 0.03 53023 - 55
4 0.04 443 49 -
5 0.05 53023 - 60
6 0.06 443 100 -
7 0.07 53023 - 70
8 0.08 443 140 -
9 0.09 53023 - 100
10 0.10 53023 - 100
11 0.11 443 210 -
12 0.12 443 240 -
13 0.13 443 270 -
14 0.14 53023 - 105
15 0.15 443 300 -
16 0.16 53023 - 150
17 0.17 443 400 -
18 0.18 443 550 -
19 0.19 53023 - 160
20 0.20 443 650 -
21 0.21 443 670 -
22 0.22 443 700 -
23 0.23 53023 - 170
24 0.24 443 800 -
25 0.25 443 850 -
26 0.26 53023 - 100
27 0.27 443 900 -
28 0.28 443 920 -
29 0.29 53023 - 100
30 0.30 443 940 -
Выходные данные:
0.02	# значение времени для 2-й строки - разность времени между 4-й строкой и 2-й строкой
0.02 # значение времени для 4-й строки - разность времени между 6-й строкой и 4-й строкой
0.02 # значение времени для 6-й строки - разность времени между 8-й строкой и 6-й строкой
0.04 # значение времени для 8-й строки - разность времени между 12-й строкой и 8-й строкой
0.04 # значение времени для 11-й строки - разность времени между 15-й строкой и 11-й строкой
0.03 # значение времени для 12-й строки - разность времени между 15-й строкой и 12-й строкой
0.04 # значение времени для 13-й строки - разность времени между 17-й строкой и 13-й строкой
0.02 # значение времени для 15-й строки - разность времени между 17-й строкой и 15-й строкой
0.01 # значение времени для 17-й строки - разность времени между 18-й строкой и 17-й строкой
0.04 # значение времени для 18-й строки - разность времени между 22-й строкой и 18-й строкой
0.04 # значение времени для 20-й строки - разность времени между 24-й строкой и 20-й строкой
0.03 # значение времени для 21-й строки - разность времени между 24-й строкой и 21-й строкой
0.03 # значение времени для 22-й строки - разность времени между 25-й строкой и 22-й строкой
0.03 # значение времени для 24-й строки - разность времени между 27-й строкой и 24-й строкой
0.05 # значение времени для 25-й строки - разность времени между 30-й строкой (так как она последняя) и 25-й строкой
0.03 # значение времени для 27-й строки - разность времени между 30-й строкой (так как она последняя) и 27-й строкой
0.02 # значение времени для 28-й строки - разность времени между 30-й строкой (так как она последняя) и 28-й строкой
0 # значение времени для 30-й строки - разность времени между 30-й строкой и 30-й строкой.
Алгоритм:
Так как количество строк известно, запускаю цикл I (for, счётчик цикла - номер строки).
Беру 1-ю строку (I=1). В первой строке значение port1=53023, значит из неё я извлекаю CWS_1 (размер буфер).
Беру 2-ю строку (I=2), в ней port1=443, для нее мне необходимо выполнить расчёт разности времени между 2-й строкой и N-й (пока неизвестной).
Для I=2 запускаю цикл N (while, счётчик цикла номер строки). Значение N от i+1 до неизвестного. Текущее значение CWS я получил ранее (в i=1), пока оно не измениться все последующие строки буду сравнивать с ним.
Беру 3-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_3 (55).
Беру 4-ю строку: в ней значение port1=443, значит из неё я считаю seq4-seq2=49, CWS на данный момент 55. Проверяю условия seq4-seq2 > CWS_3. Условие выполнятся. Продолжаю цикл N.
Беру 5-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_5 (60).
Беру 6-ю строку: в ней значение port1=443, значит из неё я считаю seq6-seq2=100, CWS на данный момент 60. Проверяю условия seq6-seq2 > CWS_3. Условие не выполнятся. Останавливаю цикл N для I=2.
Беру последнюю строку где условие выполнялось. Считаю разность времени между 4-й строкой и 2-й строкой, получаю значение 0.02, записываю в файл.
Возвращаюсь к циклу I.
Беру 3-ю строку (I=3). В 3-й строке значение port1=53023, значит из неё я извлекаю CWS_3 (60).
Беру 4-ю строку (I=4), в ней port1=443, для нее мне необходимо выполнить расчёт разности времени между 4-й строкой и N-й (пока неизвестной).
Для I=4 запускаю цикл N (while, счётчик цикла номер строки). Значение N от i+1 до неизвестного. Текущее значение CWS я получил ранее (в i=3), пока оно не измениться все последующие строки буду сравнивать с ним.
Беру 5-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_5 (60).
Беру 6-ю строку: в ней значение port1=443, значит из неё я считаю seq6-seq4=51, CWS на данный момент 60. Проверяю условия seq6-seq4 > CWS_5. Условие выполнятся. Продолжаю цикл N.
Беру 7-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_7 (70).
Беру 8-ю строку: в ней значение port1=443, значит из неё я считаю seq8-seq4=91, CWS на данный момент 70. Проверяю условия seq8-seq4 > CWS_7. Условие не выполнятся. Останавливаю цикл N для I=4.
Беру последнюю строку где условие выполнялось. Считаю разность времени между 6-й строкой и 4-й строкой, получаю значение 0.02, записываю в файл.
Возвращаюсь к циклу I.
Дохожу досюда в этом описании алгоритма
user555
Беру 4-ю строку: в ней значение port1=443, значит из неё я считаю seq4-seq2=49, CWS на данный момент 55. Проверяю условия seq4-seq2 > CWS_3. Условие выполнятся. Продолжаю цикл N.
Условие выполняется как? “Условие” - это что?
Если это ошибка в знаке больше, то это надо исправить по всему алгоритму. Если это не ошибка, тогда непонятно, что такое “условие” и в чём его выполняемость/невыполняемость заключается.



Отредактировано py.user.next (Июнь 27, 2024 00:45:53)

Офлайн

#10 Июнь 27, 2024 06:57:50

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

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

py.user.next
Если это ошибка в знаке больше, то это надо исправить по всему алгоритму.
Это ошибка моего описания, извините, что снова Вас запутываю.
Условие: seqN-seqI не больше CWS (на момент расчёта значения seqN-seqI, в N-й строке).

Алгоритм:
Так как количество строк известно, запускаю цикл I (for, счётчик цикла - номер строки).
Беру 1-ю строку (I=1). В первой строке значение port1=53023, значит из неё я извлекаю CWS_1 (размер буфер).
Беру 2-ю строку (I=2), в ней port1=443, для нее мне необходимо выполнить расчёт разности времени между 2-й строкой и N-й (пока неизвестной).
Для I=2 запускаю цикл N (while, счётчик цикла номер строки). Значение N от i+1 до неизвестного. Текущее значение CWS я получил ранее (в i=1), пока оно не измениться все последующие строки буду сравнивать с ним.
Беру 3-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_3 (55).
Беру 4-ю строку: в ней значение port1=443, значит из неё я считаю seq4-seq2=49, CWS на данный момент 55. Проверяю условие seq4-seq2 <= CWS_3 . Условие выполняется. Продолжаю цикл N.
Беру 5-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_5 (60).
Беру 6-ю строку: в ней значение port1=443, значит из неё я считаю seq6-seq2=100, CWS на данный момент 60. Проверяю условие seq6-seq2 <= CWS_3. Условие не выполняется. Останавливаю цикл N для I=2.
Беру последнюю строку где условие выполнялось. Считаю разность времени между 4-й строкой и 2-й строкой, получаю значение 0.02, записываю в файл.
Возвращаюсь к циклу I.
Беру 3-ю строку (I=3). В 3-й строке значение port1=53023, значит из неё я извлекаю CWS_3 (60).
Беру 4-ю строку (I=4), в ней port1=443, для нее мне необходимо выполнить расчёт разности времени между 4-й строкой и N-й (пока неизвестной).
Для I=4 запускаю цикл N (while, счётчик цикла номер строки). Значение N от i+1 до неизвестного. Текущее значение CWS я получил ранее (в i=3), пока оно не измениться все последующие строки буду сравнивать с ним.
Беру 5-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_5 (60).
Беру 6-ю строку: в ней значение port1=443, значит из неё я считаю seq6-seq4=51, CWS на данный момент 60. Проверяю условие seq6-seq4 <= CWS_5 . Условие выполняется. Продолжаю цикл N.
Беру 7-ю строку: в ней значение port1=53023, значит из неё я извлекаю CWS_7 (70).
Беру 8-ю строку: в ней значение port1=443, значит из неё я считаю seq8-seq4=91, CWS на данный момент 70. Проверяю условия seq8-seq4 <= CWS_7. Условие не выполняется. Останавливаю цикл N для I=4.
Беру последнюю строку где условие выполнялось. Считаю разность времени между 6-й строкой и 4-й строкой, получаю значение 0.02, записываю в файл.
Возвращаюсь к циклу I.

Отредактировано user555 (Июнь 27, 2024 13:54:12)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version