Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...

Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...
 Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 

C++ vs Python

- - - - -
  • Please log in to reply
15 replies to this topic

#1
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,604
  • Înscris: 30.07.2003
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017

 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.
OK
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 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.
Majoritatea aplicatiilor nu sunt in principal CPU-bound ci IO-bound, iar locurile din cod in care sunt CPU-bound sunt izolate.

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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005

 Mr_nobody_, on 05 aprilie 2018 - 19:16, said:

Bănuiesc că există niște avantaje, totuși, la Python, altfel nu ar fi atât de popular.
Choosing the Right Tool for the Job

#7
victor29cr

victor29cr

    Senior Member

  • Grup: Senior Members
  • Posts: 2,438
  • Înscris: 04.06.2016
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.
no 1337


#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017

 dani.user, on 05 aprilie 2018 - 21:43, said:

Daca scrii ciurul clasic, cat devine diferenta intre limbaje?
Am scris ciurul clasic în Python, dar nu știu cum să fac ca lista să fie de lungimea potrivită. Eu știu că al milionulea număr prim e < de 16 milioane, de asta am pus limita listei 16 milioane.

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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005

Quote

dar nu știu cum să fac ca lista să fie de lungimea potrivită
cate numere prime ai pana la al n-lea ?

Edited by MarianG, 06 April 2018 - 12:41.


#11
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017

 MarianG, on 06 aprilie 2018 - 12:41, said:

cate numere prime ai pana la al n-lea ?
Întrebarea mea e: câte numere ai în total până la al n-lea număr prim? :)

#12
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017

 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.
Nu funcționează așa ciurul, el ia o listă și elimină numerele non-prime, rămân cele prime. Am găsit o metodă să determin cam câte numere există în total până la un anumit număr prim. Codul nu e frumos, dar e cam de 30x mai rapid decât primul. :)

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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017

 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").
Am scris codul în C++, diferența de timp e:
[ 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
Mr_nobody_

Mr_nobody_

    Senior Member

  • Grup: Senior Members
  • Posts: 5,000
  • Înscris: 03.02.2017

 Mr_nobody_, on 07 aprilie 2018 - 08:51, said:

int* prime_list = new int[limit];

Aici trebuia să fie:
int* prime_list = new int[nr_ales];



Anunturi

Neurochirurgie minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate