Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
C++ vs Python
Last Updated: Apr 07 2018 09:49, Started by
Mr_nobody_
, Apr 05 2018 19:16
·
0
#1
Posted 05 April 2018 - 19:16
Mă cam plictisesc, așa că am început să învăț programare. Am început cu C++, dar Python pare să fie mai ușor de învățat, deci am trecut pe Python. Am făcut un progrămel care generează numere prime în Python și l-am rescris în C++. Am rămas perplex să văd că aceeași operație durează aproape de 10x mai mult în Python decât în C++. Bănuiam că Python e mai lent, dar nici chiar așa.
Bănuiesc că există niște avantaje, totuși, la Python, altfel nu ar fi atât de popular. |
#2
Posted 05 April 2018 - 19:18
Si Dacia a fost populara dar nu a castigat nimeni vreun raliu cu ea.
Scripting-ul e bun si el in anumite task-uri. |
#3
Posted 05 April 2018 - 19:19
Posteaza ambele coduri sa ne dam cu parerea (inclusiv cum ai masurat). Posibil e vreun detaliu care-ti scapa.
Edited by dani.user, 05 April 2018 - 19:19. |
#4
Posted 05 April 2018 - 19:21
dani.user, on 05 aprilie 2018 - 19:19, said:
Posteaza ambele coduri sa ne dam cu parerea (inclusiv cum ai masurat). Posibil e vreun detaliu care-ti scapa. import math nr_ales = int(input("Al catelea numar prim il vrei?\n")) prime_list = [2,3,5,7,] for nr in range(11,1000000000,2): if nr_ales < 5: break for test in range(3, 1 + int(math.sqrt(nr)), 2): if nr % test == 0: if prime_list[-1] == nr: del prime_list[-1] break if nr != prime_list[-1]: prime_list.append(nr) if len(prime_list) == nr_ales: break print("Al " + str(nr_ales) + "-lea numar prim e " + str(prime_list[nr_ales -1]) + ".") #include <iostream> #include <vector> #include <cmath> int main() { int nr_ales = 0; std::cout << "Al catelea numar prim il vrei?\n"; std::cin >> nr_ales; std::vector<int> prime_list = {2,3,5,7}; for (int nr = 11; nr <= 1000000000; nr += 2){ if (nr_ales < 5) break; for (int test = 3; test <= 1 + std::sqrt(nr); test += 2){ if (nr % test == 0){ if (prime_list.back() == nr) prime_list.pop_back(); break; } if (nr != prime_list.back()) prime_list.push_back(nr); } if (prime_list.size() == nr_ales) break; } std::cout << "Al " << nr_ales << "-lea numar prim e " << prime_list[nr_ales -1] << ".\n"; return 0; } |
#5
Posted 05 April 2018 - 19:22
Mr_nobody_, on 05 aprilie 2018 - 19:16, said:
Mă cam plictisesc, așa că am început să învăț programare. Am început cu C++, dar Python pare să fie mai ușor de învățat, deci am trecut pe Python. Am făcut un progrămel care generează numere prime în Python și l-am rescris în C++. Am rămas perplex să văd că aceeași operație durează aproape de 10x mai mult în Python decât în C++. Bănuiam că Python e mai lent, dar nici chiar așa. Bănuiesc că există niște avantaje, totuși, la Python, altfel nu ar fi atât de popular. Acele locuri pot fi usor optimizate, atunci cand ele creaza probleme (atunci cand utilizatorii se plang ca operatia X e prea lenta). Una dintre optimizarile posibile e rescrierea acelei portiuni de cod ca modul nativ (in C, C++ sau rust, de exemplu). Pana cand asta se intampla, Python are avantajul ca e mai usor de dezvoltat in el, mai accesibil, ecosistemul de biblioteci e mai bogat, documentatie mai multa, comunitate mai omogena. Deci.. stai la Python ca e bun pentru invatat, dar extinde-te treptat si catre alte limbaje. Edited by OriginalCopy, 05 April 2018 - 19:23. |
#6
Posted 05 April 2018 - 19:25
#7
Posted 05 April 2018 - 19:58
Python este popular pentru ca te scoate din rahat rapid, mai ales cand ai un client nerabdator si nu il intereseaza in ce ii scrii tu softul. In materie de procesare de date, nu o sa stea niciun client sa vada in cate secunde termina crawlerul tau de parcurs o pagina web comparativ cu c++. Python e foarte intuitiv, e atat de folosit incat in 99% din cazuri gasesti rezolvare la un bug doar cautand "nume_bug stackoverflow". Dupa 1-2 ani de Python, iti va fi usor sa treci cam la orice alt limbaj. Sau macar mult mai usor.
Edited by MarianG, 05 April 2018 - 20:17.
|
#8
Posted 05 April 2018 - 21:43
Un bun exemplu pentru o mica demonstratie despre cum sa optimizezi un program dupa ce determini cu precizie unde e problema. Am rulat programul sub o masina virtual Linux si am cautat mereu al 1.000.000-lea numar prim.
Prima observatie: cand ai o bucla atat de consistenta orice iti incetineste codul va avea un efect mult mai pronuntat. C++ Quote
gcc 6.3.0 g++ --std=c++14 -O3 -g primes.cpp Rularea codului initial a dus la urmatorul timp strict pentru bucla exterioara: Quote
Al 1000000-lea numar prim e 15485863. Cautarea a durat: 11387 ms 11 secunde. Nu e chiar putin. Oare ce contribuie la acest timp? Hai sa masuram mai detaliat: Quote 64,524,355 for (int nr = 11; nr <= 1'000'000'000; nr += 2){ . if (nr_ales < 5) . break; 11,349,362,602 for (int test = 3; test <= 1 + std::sqrt(nr); test += 2){ 9,728,661,906 if (nr % test == 0){ 13,485,862 if (prime_list.back() == nr) . prime_list.pop_back(); . break; . } 4,844,102,160 if (nr != prime_list.back()) . prime_list.push_back(nr); . } 15,485,854 if (prime_list.size() == nr_ales) . break; . } Linia cu acel for contribuie masiv la operatiile efectuate de program. Care parte a sa? std::sqrt(nr), recalculat la fiecare verificare a conditiei. Putem scrie altfel aceasta conditie? Da: for (int test = 3, n = std::sqrt(nr); test <= 1 + n; test += 2){ Ce rezulta? Quote
Al 1000000-lea numar prim e 15485863. Cautarea a durat: 5432 ms Mai mult de 2x mai repede. Ce-a mai ramas? A mai ramas o operatie dureroasa pentru procesor: nr % test, impartirea fiind printre cele mai lente operatii ce le poate face procesorul. Aici ai nevoie de o alta abordare, una care sa evite pe cat posibil % sau /. Tema de casa Daca scrii ciurul clasic, cat devine diferenta intre limbaje? Edited by dani.user, 05 April 2018 - 21:44. |
#9
Posted 06 April 2018 - 12:15
dani.user, on 05 aprilie 2018 - 21:43, said:
Daca scrii ciurul clasic, cat devine diferenta intre limbaje? Oricum, programul ăsta e mult mai rapid decât celălalt: import math limit = 16000000 limit_sqrt = 1 + int(math.sqrt(limit)) bool_list = [True] * limit bool_list[0] = bool_list[1] = False for i in range(2, limit_sqrt): if bool_list[i] == True: for item in range(i*i, limit, i): bool_list[item] = False prime_list = [] for index, value in enumerate(bool_list): if value == True: prime_list.append(index) print(prime_list[1000000-1]) |
#10
Posted 06 April 2018 - 12:41
Quote dar nu știu cum să fac ca lista să fie de lungimea potrivită Edited by MarianG, 06 April 2018 - 12:41. |
|
#11
Posted 06 April 2018 - 12:54
#12
Posted 06 April 2018 - 13:39
Cauta un mod prin care sa determini (cu exactitate sau macar aproximativ), in fiecare moment, cate numere prime ai gasit pana in acel moment.
|
#13
Posted 06 April 2018 - 18:02
dani.user, on 06 aprilie 2018 - 13:39, said:
Cauta un mod prin care sa determini (cu exactitate sau macar aproximativ), in fiecare moment, cate numere prime ai gasit pana in acel moment. import math nr_ales = int(input("Al catelea numar prim il vrei?\n")) if nr_ales < 27: limit = 103 else: limit = nr_ales * 1.2 * math.log(nr_ales) limit = int(limit) limit_sqrt = 1 + int(math.sqrt(limit)) bool_list = [True] * limit bool_list[0] = bool_list[1] = False for i in range(2, limit_sqrt): if bool_list[i] == True: for item in range(i*i, limit, i): bool_list[item] = False prime_list = [] for index, value in enumerate(bool_list): if value == True: prime_list.append(index) print("Al " + str(nr_ales) + "-lea numar prim e " + str(prime_list[nr_ales -1]) + ".") |
#14
Posted 06 April 2018 - 22:49
Ma gandeam ca pe masura ce elimini numerele non-prime stii deja ca ai toate numele prime pana un punct (cand cauti multipli ai 101 de exemplu poti spune daca 71 e prim sau nu, nu mai faci nimic ulterior care sa-ti schimbe "parerea").
|
#15
Posted 07 April 2018 - 08:51
dani.user, on 06 aprilie 2018 - 22:49, said:
Ma gandeam ca pe masura ce elimini numerele non-prime stii deja ca ai toate numele prime pana un punct (cand cauti multipli ai 101 de exemplu poti spune daca 71 e prim sau nu, nu mai faci nimic ulterior care sa-ti schimbe "parerea"). [ https://i.imgur.com/s9NMnXm.png - Pentru incarcare in pagina (embed) Click aici ] Codul: #include <iostream> #include <cmath> int main() { int nr_ales = 0; std::cout << "Al catelea numar prim il vrei?\n"; std::cin >> nr_ales; int limit = 0; if (nr_ales < 90) limit = 500; else limit = nr_ales * 1.2 * log(nr_ales); int limit_sqrt = 1 + std::sqrt(limit); int* bool_list = new int[limit]; for (int l = 2; l < limit; l++) bool_list[l] = 1; for (int i = 2; i <= limit_sqrt; i++) if (bool_list[i] == 1) for (int item = i*i; item < limit; item += i) bool_list[item] = 0; int k = 0; int* prime_list = new int[limit]; for (int j = 2; j < limit; j++) if (bool_list[j] == 1){ prime_list[k] = j; k++; } std::cout << "Al " << nr_ales << "-lea numar prim e " << prime_list[nr_ales -1] << ".\n"; return 0; } Edited by Mr_nobody_, 07 April 2018 - 09:01. |
|
#16
Posted 07 April 2018 - 09:49
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users