2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11  След.
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 13:59 
Аватара пользователя
wrest в сообщении #1708687 писал(а):
Да, от 3 до 10 раз.

Если я Вам пришлю программу, сможете её потестить на предмет ускорения?

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 14:23 
Yadryara в сообщении #1708711 писал(а):
Если я Вам пришлю программу, сможете её потестить на предмет ускорения?

Да, если это будет законченная функция (t_CLOSURE)
То есть это не должен быть код как вы его вписываете в интерпретаторе, а должно быть всё обёрнуто в my_function(args)={...}
Соответственно, функция не должна использовать глобальные переменные внутри своего кода, т.е. всё что ей надо должно передаваться через аргументы.
Ну и конечно все локальные переменные надо объявить через my().

Но как тут выяснилось ( post1708709.html#p1708709 ) может и замедлиться.

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 15:10 
Аватара пользователя
wrest, я в функциях весьма мало понимаю. И программа на этот раз весьма сложная.

Если Дмитрий согласится, пришлю ему. А уж что-там в функцию удастся обернуть, а что нет, пока без понятия. Боюсь, что объяснять долго придётся.

Но вот же есть хорошая задача. Допустим, напишу код, который определяет полупростоту чисел с numdiv и без. И вот его надо попытаться скомпилить.

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 16:19 
Yadryara в сообщении #1708718 писал(а):
я в функциях весьма мало понимаю.

Ну если проиллюстрировать, то надо
Код:
Ya_func(start, stop) = {
    my(b = n = kpod = 0);
    for(x = start, stop,
        if(numdiv(x) == 4,
            if(n == 0, b = x);
            n++,
            if(n > 2, kpod++); n = 0
        );
    );
    return(kpod);
}


Вместо
Код:
{print();t0=getwalltime();
b=n=kpod=0;
for(x=2,10^8,
if(numdiv(x)==4,
if(n==0, b=x); n++ ,
if(n>2, kpod++); n=0); );
print(kpod);
print;print(strtime(getwalltime()-t0));print;
}


Тогда имеем.
Интерпретация:
Код:
? Ya_func(2,10^7)
time = 8,039 ms.
%4 = 15197
?

Компиляция:
Код:
? Ya_func(2,10^7)
time = 4,313 ms.
%1 = 15197
?

Ускорение в 2 раза.

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 16:30 
wrest
А что, без функций, когда всё в main(), gp2c не может?

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 16:33 
Аватара пользователя
wrest, Спасибо, буду разбираться.

wrest в сообщении #1708726 писал(а):
Ускорение в 2 раза.

Ну, я критично к таким вещам отношусь. И не округляю в свою пользу. Не в два раза, а на 86%.

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 16:45 
Dmitriy40 в сообщении #1708728 писал(а):
А что, без функций, когда всё в main(), gp2c не может?

Нет смысла. Как это запускать потом?

-- 09.11.2025, 16:51 --

Yadryara в сообщении #1708729 писал(а):
Ну, я критично к таким вещам отношусь. И не округляю в свою пользу. Не в два раза, а на 86%.

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

 
 
 
 Re: Как писать быстрые программы
Сообщение09.11.2025, 19:18 
Dmitriy40 в сообщении #1708728 писал(а):
А что, без функций, когда всё в main(), gp2c не может?
wrest в сообщении #1708730 писал(а):
Нет смысла. Как это запускать потом?


Попробовал сейчас транслировать код
Код:
{print();t0=getwalltime();
b=n=kpod=0;
for(x=2,10^7,
if(numdiv(x)==4,
if(n==0, b=x); n++ ,
if(n>2, kpod++); n=0); );
print(kpod);
print;print(strtime(getwalltime()-t0));print;
}


Получилось следующее:
код: [ скачать ] [ спрятать ]
  1. /*-*- compile-command: "aarch64-linux-android-clang -c -o ya-t.gp.o -O3 -Wall -fno-strict-aliasing -fstack-protector-strong -Oz -isystem/data 
  2. /data/com.termux/files/usr/include/c++/v1 -isystem/data/data/com.termux/files/usr/include -fPIC -I\"/data/data/com.termux/files/usr/include\" 
  3.  ya-t.gp.c && -o ya-t.gp.so ya-t.gp.o -Wl,-rpath,/data/data/com.termux/files/usr/lib "; -*-*/ 
  4. #include <pari/pari.h> 
  5. /* 
  6. GP;install("init_ya_t","v","init_ya_t","./ya-t.gp.so"); 
  7. */ 
  8. void init_ya_t(void); 
  9. /*End of prototype*/ 
  10.  
  11. static GEN t0; 
  12. static GEN b; 
  13. static GEN n; 
  14. static GEN kpod; 
  15. /*End of global vars*/ 
  16.  
  17. void 
  18. init_ya_t(void)   /* void */ 
  19.   GEN p1; 
  20.   t0 = pol_x(fetch_user_var("t0")); 
  21.   b = pol_x(fetch_user_var("b")); 
  22.   n = pol_x(fetch_user_var("n")); 
  23.   kpod = pol_x(fetch_user_var("kpod")); 
  24.   pari_printf("\n"); 
  25.   t0 = getwalltime(); 
  26.   b = n = kpod = gen_0; 
  27.   p1 = powis(stoi(10), 7); 
  28.   { 
  29.     GEN x; 
  30.     for (x = gen_2; gcmp(x, p1) <= 0; x = gaddgs(x, 1)) 
  31.     { 
  32.       if (equalis(numdiv(x), 4)) 
  33.       { 
  34.         if (gequal0(n)) 
  35.           b = x; 
  36.         n = gaddgs(n, 1); 
  37.       } 
  38.       else 
  39.       { 
  40.         if (gcmpgs(n, 2) > 0) 
  41.           kpod = gaddgs(kpod, 1); 
  42.         n = gen_0; 
  43.       } 
  44.     } 
  45.   } 
  46.   pari_printf("%Ps\n", kpod); 
  47.   pari_printf("\n"); 
  48.   pari_printf("%Ps\n", strtime(gtos(gsub(getwalltime(), t0)))); 
  49.   pari_printf("\n"); 
  50.   return; 


Так что в общем можно и просто текст.
Тогда оно оборачивается в фукцию init_{filename}() само. В этом случае имя файла было ya-t.gp но минус стал подчеркиванием в тексте на C
Запуск:
Код:
? init_ya_t()

  *** init_ya_t: Warning: increasing stack size to 800000000.
15197

4,427 ms

time = 4,219 ms.
?

 
 
 
 Re: Как писать быстрые программы
Сообщение10.11.2025, 00:13 
Аватара пользователя
wrest
Отлично. Выслал код. Просьба на форуме его пока не светить.

 
 
 
 Re: Как писать быстрые программы
Сообщение11.11.2025, 10:55 
Аватара пользователя
Вроде понятно, что надо как-то WSL установить. Но страшно.

wrest, а что за код, кстати. Ведь количество чисел ровно с 4 делителями считается совсем по-простому:

Код:
{print();t0=getwalltime();
kpod=0;
for(n=2,10^2, if(numdiv(n)==4, kpod++));
print(kpod);
print;print(strtime(getwalltime()-t0));print;
}

Их до сотни и впрямь 32:

Код:
   8  27                                              2 штуки

         3  5  7 11 13 17 19 23 29 31 37 41 43 47
   2 *   6 10 14 22 26 34 38 46 58 62 74 82 86 94    14 штук
   3 *     15 21 33 39 51 57 69 87 93                 9
   5 *        35 55 65 85 95                          5
   7 *           77 91                                2
_______________________________________________________
0 — 1e2                                              32

 
 
 
 Re: Как писать быстрые программы
Сообщение11.11.2025, 11:54 
Yadryara в сообщении #1708858 писал(а):
а что за код, кстати.

Вопрос не понял

-- 11.11.2025, 11:58 --

Yadryara в сообщении #1708858 писал(а):
Вроде понятно, что надо как-то WSL установить. Но страшно.

В смысле страшно? А например ms office устанавливать не страшно?


Инструкция: https://learn.microsoft.com/ru-ru/windows/wsl/install

 
 
 
 Re: Как писать быстрые программы
Сообщение11.11.2025, 12:26 
Аватара пользователя
Спасибо.

А Ms Office устанавливать вроде не страшно, но он у меня нынче и не установлен. Я же совсем недавно ворчал по поводу Экселя.

wrest, вот этот вопрос я предлагал обсудить, а ваш код делает что-то другое.

Yadryara в сообщении #1708686 писал(а):
Вот сейчас на повестке дня вопрос: как быстро определять что у числа имеется ровно 4 делителя, ровно 8 делителей, ровно 16 делителей?

Надо вновь задаться вопросом, а как наиболее быстро понять, что то или иное число не имеет нужного количества делителей.

 
 
 
 Re: Как писать быстрые программы
Сообщение11.11.2025, 12:43 
Yadryara в сообщении #1708862 писал(а):
а ваш код делает что-то другое.

Какой "мой код"? :shock:
А...
Пример для компиляции в моём посте post1708745.html#p1708745 взят из вашего поста post1702961.html#p1702961 после текста
Yadryara в сообщении #1702961 писал(а):
Да, Дмитрий написал правильную прогу, только моя до 1e8 пока работает почти втрое быстрее. Вот чуть поправил вывод у Дмитрия:

Что он считает не знаю. Я смотрел только чтотон вообще запускается, сколько времени он считает в интерпретаторе и после компиляции.

 
 
 
 Re: Как писать быстрые программы
Сообщение11.11.2025, 12:52 
Аватара пользователя
Прошу прощения, подумал, что это ваш. Вы же не сказали чей он и не процитировали:

wrest в сообщении #1708745 писал(а):
Попробовал сейчас транслировать код

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

 
 
 
 Re: Как писать быстрые программы
Сообщение11.11.2025, 12:59 
Аватара пользователя
Yadryara в сообщении #1708686 писал(а):
как быстро определять что у числа имеется ровно 4 делителя, ровно 8 делителей, ровно 16 делителей?
Какого порядка числа?

 
 
 [ Сообщений: 152 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group