私はPythonで問題12(プロジェクトオイラー)の解決策を書こうとしていました。解決策が遅すぎたので、インターネットで他の人の解決策を調べてみました。私はこのコードがC++で書かれていることを発見しました。これは、私のpythonコードと実質的にまったく同じことを行いますが、わずかな違いがあります。
Python:
def find_number_of_divisiors(n):
if n == 1:
return 1
div = 2 # 1 and the number itself
for i in range(2, n/2 + 1):
if (n % i) == 0:
div += 1
return div
def tri_nums():
n = 1
t = 1
while 1:
yield t
n += 1
t += n
t = tri_nums()
m = 0
for n in t:
d = find_number_of_divisiors(n)
if m < d:
print n, ' has ', d, ' divisors.'
m = d
if m == 320:
exit(0)
C ++:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned int iteration = 1;
unsigned int triangle_number = 0;
unsigned int divisor_count = 0;
unsigned int current_max_divisor_count = 0;
while (true) {
triangle_number += iteration;
divisor_count = 0;
for (int x = 2; x <= triangle_number / 2; x ++) {
if (triangle_number % x == 0) {
divisor_count++;
}
}
if (divisor_count > current_max_divisor_count) {
current_max_divisor_count = divisor_count;
std::cout << triangle_number << " has " << divisor_count
<< " divisors." << std::endl;
}
if (divisor_count == 318) {
exit(0);
}
iteration++;
}
return 0;
}
私のマシンでは、Pythonコードの実行に1分25.83秒かかります。C++コードは約4.628秒かかりますが。そのように18倍高速です。私はC++コードがより高速になることを期待していましたが、この大きな差ではなく、2つのループと多数の増分とmodで構成される単純なソリューションの場合も同様です。
この問題を解決する方法についての回答をいただければ幸いですが、私が聞きたい主な質問は、なぜC++コードがこれほど高速なのかということです。私はPythonで何か間違ったものを使用/実行していますか?
範囲をxrangeに置き換える:
rangeをxrangeに置き換えた後、Pythonコードの実行には約1分11.48秒かかります。(約1.2倍高速)