Необычная разница в скорости между Python и C ++
Я недавно написал короткий алгоритм для расчетасчастливые числа в питоне. Программа позволяет выбрать верхнюю границу и определит все счастливые числа под ней. Для сравнения скорости я решил сделать самый прямой из известных мне алгоритмов перевода с python на c ++.
Удивительно, но версия c ++ работает значительно медленнее, чем версия python. Точные тесты скорости между временами выполнения для обнаружения первых 10000 счастливых чисел показывают, что программа python работает в среднем за 0,59 секунды, а версия c ++ работает в среднем за 8,5 секунд.
Я бы объяснил эту разницу в скорости тем, что мне пришлось писать вспомогательные функции для частей вычислений (например, для определения, находится ли элемент в списке / массиве / векторе) в версии c ++, которая уже встроена в язык Python. ,
Во-первых, является ли это истинной причиной такой абсурдной разницы в скорости, и, во-вторых, как я могу изменить версию c ++ для более быстрого выполнения, чем версия python (так, как мне кажется).
Два куска кода с тестированием скорости здесь:Версия Python, Версия C ++, Спасибо за помощь.
#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"