问题:
找出所有的a,b.c组合, 使得 a + b + c = 1000, a*a + b*b = c*c
. 其中a,b,c均为3个自然数.
分别以go1.17.7, Python 3.9.0, PHP 7.4.3解答该问题。
每个解答中 tt1()为三遍循环, tt2() 为优化后的解法
可以看到go执行耗时
tt1() 用时 731496100 ns = 0.7314961 s
tt2() 用时 548000 ns = 0.000548 s
可以看到python执行耗时
tt1() 用时: 74647421900 ns = 74.6474219 秒
tt2() 用时: 291977200 ns = 0.2919772 秒
可以看到php执行耗时
tt1() 执行时间: 37557302300 ns = 37.5573023 秒
tt2() 执行时间: 28231300 ns = 0.0282313 秒
对比可以发现go在大的运算方面性能特别高
php的执行性能也比python的高
以上执行时间, 每次执行可能略有差异, 但不妨碍性能测试指标和结果
以下是go的解法, 其中tt1()为三遍循环, tt2() 为优化后的解法
package main
import (
"fmt"
"time"
)
// a + b + c = 1000, a*a + b*b = c*c
// tt1() 用时 731496100 ns = 0.7314961 s
// tt2() 用时 548000 ns = 0.000548 s
//func tt1() {
// for a := 0; a < 1001; a++ {
// for b := 0; b < 1001; b++ {
// for c := 0; c < 1001; c++ {
// if a+b+c == 1000 && a*a+b*b == c*c {
// fmt.Printf("a=%d, b=%d, c=%d\n", a, b, c)
// }
// }
// }
// }
//}
func tt2() {
for a := 0; a < 1001; a++ {
for b := 0; b < 1001-a; b++ {
c := 1000 - a - b
if a*a+b*b == c*c {
fmt.Printf("a=%d, b=%d, c=%d\n", a, b, c)
}
}
}
}
func main() {
start := time.Now().UnixNano()
tt2()
end := time.Now().UnixNano()
fmt.Println("用时: ", end-start)
}
以下是python的解法, 其中tt1()为三遍循环, tt2() 为优化后的解法
import time
# python3.9
# tt1() 用时: 74647421900 ns = 74.6474219 秒
# tt2() 用时: 291977200 ns = 0.2919772 秒
# def tt1():
# for a in range(1001):
# for b in range(1001):
# for c in range(1001):
# if a + b + c == 1000 and a ** 2 + b ** 2 == c ** 2:
# print("a=%d,b=%d,c=%d" % (a, b, c))
def tt2():
for a in range(1001):
for b in range(1001 - a):
c = 1000 - a - b
if a ** 2 + b ** 2 == c ** 2:
print("a=%d,b=%d,c=%d" % (a, b, c))
if __name__ == '__main__':
start = time.time_ns()
tt2()
end = time.time_ns()
print('用时: ', end - start)
以下是php的解法, 其中tt1()为三遍循环, tt2() 为优化后的解法
<?php
// php7.3
// tt1() 执行时间: 37557302300 ns = 37.5573023 秒
// tt2() 执行时间: 28231300 ns = 0.0282313 秒
//function tt1()
//{
// for ($i = 0; $i < 1001; $i++) {
// for ($j = 0; $j < 1001; $j++) {
// for ($k = 0; $k < 1001; $k++) {
// if ($i + $j + $k == 1000 && $i * $i + $j * $j == $k * $k) {
// echo 'i=' . $i . ',j=' . $j . ', k=' . $k . PHP_EOL;
// }
// }
// }
// }
//}
function tt2()
{
for ($i = 0; $i < 1001; $i++) {
for ($j = 0; $j < 1001 - $i; $j++) {
$k = 1000 - $i - $j;
if ($i * $i + $j * $j == $k * $k) {
echo 'i=' . $i . ',j=' . $j . ', k=' . $k . PHP_EOL;
}
}
}
}
$start = hrtime(true);
tt2();
$end = hrtime(true);
echo '执行时间: ' . ($end - $start);