同样的算法,为什么Python这么慢?PHP与Ruby都很快啊!
璀璨夜空 2018-09-12 10:54:18 ================Python==============
#!/usr/bin/python
# PI = 4 * (1 / 1 - 1 / 3 + 1 / 5 - 1 / 7 + ...)
def pi(n):
i = 0
num = 1.0
sum = 0
while i < n:
sum += (-1)**i * (1.0 / num)
i += 1
num += 2
return sum * 4
NUM = 1000000
i = NUM
print("calculating...")
while i <= NUM + 10:
print("n: " + str(i) + " -> pi: " + str(pi(i)))
i += 1
print("done.")
===============结果===============
calculating...
n: 1000000 -> pi: 3.14159165359
n: 1000001 -> pi: 3.14159365359
n: 1000002 -> pi: 3.14159165359
n: 1000003 -> pi: 3.14159365359
n: 1000004 -> pi: 3.14159165359
n: 1000005 -> pi: 3.14159365358
n: 1000006 -> pi: 3.1415916536
n: 1000007 -> pi: 3.14159365358
n: 1000008 -> pi: 3.1415916536
n: 1000009 -> pi: 3.14159365358
n: 1000010 -> pi: 3.1415916536
done.
[Finished in 4.1s]
=============PHP=============
<?php
// PI = 4 * (1 / 1 - 1 / 3 + 1 / 5 - 1 / 7 + ...)
function math_pi($n)
{
$i = 0;
$num = 1.0;
$sum = 0;
while ($i < $n)
{
$sum += (-1) ** $i * (1.0 / $num);
$i += 1;
$num += 2;
}
return $sum * 4;
}
$NUM = 1000000;
$i = $NUM;
echo "calculating...\n";
while ($i <= $NUM + 10)
{
echo "n: " . $i . " -> pi: " . math_pi($i) . "\n";
$i++;
}
echo "done.\n";
==============结果===============
calculating...
n: 1000000 -> pi: 3.1415916535898
n: 1000001 -> pi: 3.1415936535888
n: 1000002 -> pi: 3.1415916535918
n: 1000003 -> pi: 3.1415936535868
n: 1000004 -> pi: 3.1415916535938
n: 1000005 -> pi: 3.1415936535848
n: 1000006 -> pi: 3.1415916535958
n: 1000007 -> pi: 3.1415936535828
n: 1000008 -> pi: 3.1415916535978
n: 1000009 -> pi: 3.1415936535808
n: 1000010 -> pi: 3.1415916535998
done.
[Finished in 1.2s]
===============Ruby=============
#!/usr/bin/ruby
# PI = 4 * (1 / 1 - 1 / 3 + 1 / 5 - 1 / 7 + ...)
def pi(n)
i = 0
num = 1.0
sum = 0
while i < n
sum += (-1) ** i * (1.0 / num)
i += 1
num += 2
end
sum * 4
end
puts "calculating..."
STDOUT.flush
NUM = 1_000_000
(NUM..NUM + 10).each do |n|
puts "n: #{n} -> pi: #{pi(n)}"
STDOUT.flush
end
puts "done."
==============结果=============
calculating...
n: 1000000 -> pi: 3.1415916535897743
n: 1000001 -> pi: 3.1415936535887745
n: 1000002 -> pi: 3.1415916535917745
n: 1000003 -> pi: 3.1415936535867743
n: 1000004 -> pi: 3.1415916535937742
n: 1000005 -> pi: 3.141593653584774
n: 1000006 -> pi: 3.141591653595774
n: 1000007 -> pi: 3.141593653582774
n: 1000008 -> pi: 3.1415916535977737
n: 1000009 -> pi: 3.141593653580774
n: 1000010 -> pi: 3.1415916535997734
done.
[Finished in 1.0s]