Diferencia de velocidad inusual entre Python y C ++

Hace poco escribí un algoritmo corto para calcularnúmeros felices en pitón. El programa te permite elegir un límite superior y determinará todos los números felices debajo de él. Para una comparación de velocidad, decidí hacer la traducción más directa del algoritmo que conocía de python a c ++.

Sorprendentemente, la versión de c ++ se ejecuta significativamente más lento que la versión de python. Las pruebas de velocidad precisas entre los tiempos de ejecución para descubrir los primeros 10,000 números felices indican que el programa python se ejecuta en promedio en 0.59 segundos y la versión c ++ se ejecuta en promedio en 8.5 segundos.

Yo atribuiría esta diferencia de velocidad al hecho de que tuve que escribir funciones de ayuda para partes de los cálculos (por ejemplo, determinar si un elemento está en una lista / matriz / vector) en la versión c ++ que ya estaba incorporada en el lenguaje python .

En primer lugar, ¿es esta la verdadera razón de una diferencia de velocidad tan absurda y, en segundo lugar, cómo puedo cambiar la versión de c ++ para que se ejecute más rápidamente que la versión de python (la forma en que debería ser, en mi opinión)?

Las dos piezas de código, con las pruebas de velocidad están aquí:Versión de Python, Versión C ++. Gracias por la ayuda.

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

Respuestas a la pregunta(17)

Su respuesta a la pregunta