我試圖寫的Python爲Problem 12 (Project Euler)的解決方案。解決方案太慢了,所以我試圖在互聯網上檢查其他人的解決方案。我發現用C++編寫的this code與我的Python代碼幾乎完全相同,只是有一些微不足道的差異。幾乎相同的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個循環以及一堆增量和模塊。
雖然我很感謝如何解決這個問題的答案,但我想問的主要問題是爲什麼C++代碼如此之快?我在Python中使用/做錯了什麼?
更換範圍與x範圍:
與x範圍的Python代碼替換範圍之後需要1分鐘左右11.48秒執行。 (大約快1.2倍)
考慮使用'xrange',而不是'range'。也只是考慮使用C++ – phs 2013-03-16 04:25:29
它真的很晚,所以我的頭腦可能有點模糊,但找到除數的一個小改進將只是在for循環中的sqrt(n)而不是n/2 + 1。 ..但是你必須每次都添加2到div。一個是小於sqrt(n)的除數,另一個是它的codivisor(是一個單詞嗎?) – 2013-03-16 04:27:03
是的,但他在兩個版本中都這樣做。 – Jared 2013-03-16 04:28:41