Diferença de velocidade incomum entre Python e C ++

Eu escrevi recentemente um algoritmo curto para calcularnúmeros felizes em python. O programa permite que você escolha um limite superior e ele determinará todos os números felizes abaixo dele. Para uma comparação de velocidade, decidi fazer a tradução mais direta do algoritmo que conheci de python para c ++.

Surpreendentemente, a versão c + + é executada significativamente mais lenta que a versão em python. Testes de velocidade precisos entre os tempos de execução para descobrir os primeiros 10.000 números felizes indicam que o programa python é executado em média em 0,59 segundos e a versão em c ++ é executada em média em 8,5 segundos.

Atribuiria essa diferença de velocidade ao fato de que eu tinha que escrever funções auxiliares para partes dos cálculos (por exemplo, determinar se um elemento está em uma lista / matriz / vetor) na versão c ++ que já estava embutida na linguagem python .

Em primeiro lugar, este é o verdadeiro motivo para uma diferença de velocidade tão absurda, e em segundo lugar, como posso alterar a versão c + + para executar mais rapidamente do que a versão python (da maneira que deveria ser na minha opinião).

Os dois pedaços de código, com testes de velocidade estão aqui:Versão Python, Versão C ++. Obrigado pela ajuda.

#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"

questionAnswers(17)

yourAnswerToTheQuestion