J'ai récemment écrit un petit algorithme pour calculer des chiffres heureux en python. Le programme vous permet de choisir une limite supérieure et il déterminera tous les nombres heureux en dessous de celle-ci. Pour une comparaison de vitesse, j'ai décidé de faire la traduction la plus directe de l'algorithme que je connaissais de python à c++.
De manière surprenante, la version c++ fonctionne beaucoup plus lentement que la version python. Des tests de vitesse précis entre les temps d'exécution pour découvrir les 10 000 premiers nombres heureux indiquent que le programme python s'exécute en moyenne en 0,59 seconde et la version c++ en 8,5 secondes.
J'attribue cette différence de vitesse au fait que j'ai dû écrire des fonctions d'aide pour certaines parties des calculs (par exemple déterminer si un élément est dans une liste/un tableau/un vecteur) dans la version c++ qui étaient déjà intégrées dans le langage python.
Premièrement, est-ce la vraie raison d'une différence de vitesse aussi absurde, et deuxièmement, comment puis-je changer la version c++ pour qu'elle s'exécute plus rapidement que la version python (comme cela devrait être le cas à mon avis).
Les deux morceaux de code, avec les tests de vitesse, sont ici : Version Python , Version C++ . Merci pour votre aide.
#include <iostream>
#include <vector>
#include <string>
#include <ctime>
#include <windows.h>
using namespace std;
bool inVector(int inQuestion, vector<int> known);
int sum(vector<int> given);
int pow(int given, int power);
void calcMain(int upperBound);
int main()
{
while(true)
{
int upperBound;
cout << "Pick an upper bound: ";
cin >> upperBound;
long start, end;
start = GetTickCount();
calcMain(upperBound);
end = GetTickCount();
double seconds = (double)(end-start) / 1000.0;
cout << seconds << " seconds." << endl << endl;
}
return 0;
}
void calcMain(int upperBound)
{
vector<int> known;
for(int i = 0; i <= upperBound; i++)
{
bool next = false;
int current = i;
vector<int> history;
while(!next)
{
char* buffer = new char[10];
itoa(current, buffer, 10);
string digits = buffer;
delete buffer;
vector<int> squares;
for(int j = 0; j < digits.size(); j++)
{
char charDigit = digits[j];
int digit = atoi(&charDigit);
int square = pow(digit, 2);
squares.push_back(square);
}
int squaresum = sum(squares);
current = squaresum;
if(inVector(current, history))
{
next = true;
if(current == 1)
{
known.push_back(i);
//cout << i << "\t";
}
}
history.push_back(current);
}
}
//cout << "\n\n";
}
bool inVector(int inQuestion, vector<int> known)
{
for(vector<int>::iterator it = known.begin(); it != known.end(); it++)
if(*it == inQuestion)
return true;
return false;
}
int sum(vector<int> given)
{
int sum = 0;
for(vector<int>::iterator it = given.begin(); it != given.end(); it++)
sum += *it;
return sum;
}
int pow(int given, int power)
{
int original = given;
int current = given;
for(int i = 0; i < power-1; i++)
current *= original;
return current;
}
#!/usr/bin/env python
import timeit
upperBound = 0
def calcMain():
known = []
for i in range(0,upperBound+1):
next = False
current = i
history = []
while not next:
digits = str(current)
squares = [pow(int(digit), 2) for digit in digits]
squaresum = sum(squares)
current = squaresum
if current in history:
next = True
if current == 1:
known.append(i)
##print i, "\t",
history.append(current)
##print "\nend"
while True:
upperBound = input("Pick an upper bound: ")
result = timeit.Timer(calcMain).timeit(1)
print result, "seconds.\n"