計算方法
由萊布尼茲公式變形後得到的
要是想用其他算法可以參考這裏https://www.zhihu.com/question/312520105
代碼
c
//萊布尼茲公式求PI 取MAX k=1,000,000,000
#include<stdio.h>
#define TIMES 1000000000
int main()
{
long double pi=0;
for (double i = 0; i < TIMES; i++)
{
pi += 1 / ((4 * i + 1) * (2 * i + 1) * (i + 1));
}
pi *= 3;
printf("%.12llf", pi);
}
python
pi=0;
MaxK=1000000000
i=0
while(i<MaxK):
pi += 1 / ((4 * i + 1) * (2 * i + 1) * (i + 1));
i+=1
pi *= 3;
print(f"{pi:.12f}");
運行結果
運行環境都是VS2019,64位處理器,intel i7 8550U 3.24MHZ(基準1.8MHZ) C代碼分爲
- DEBUG模式,沒有優化。x86
- RELEASE,x86
- RELEASE,x86-64
Python使用得是CPython
這裏採用了VS自帶的代碼分析器,感覺計時代碼影響實際結果更精確一點,不過也沒差。
VS的編譯器和GCC的優化上有區別,各有千秋,同樣的C代碼速度不同,似乎VS更快一點?
C/C++
Python
等了10幾分鐘,真TM後悔選了個這麼大的數
無優化下速度相差186.8倍。一般而言C/C++要比python快150~400倍
C/C++(release)
C/C++(release x64)
優化前後C代碼速度差別大概是3倍。
優化後的C是PY的629.897 ÷ 1.825 =345.14倍。( ̄_, ̄ )
比較奇怪得是64位程序居然比32位要慢,我沒大想明白,我猜可能是和處理器字長和程序裏得數據長度有關。關於這個問題我在網上也沒有找到相似的問題,唯一一個相似的問題是在講android,是由於x64指針尋址更慢導致的。但在同一cpu上應該不成立這個條件。
結
解釋型語言和編譯型語言速度差別巨大,雖然針對各自的特點能對一些特別的地方進行優化,(比如記得java這種半解釋型語言可以在運行時進行預測編譯,從而在某些動態場景下比C/C++更快)但一般運行時的速度差別是由於語言性質決定的,只能無限得逼近編譯行語言.
順便貼一份自己看到的測試結果吧:https://cloud.tencent.com/developer/news/299769