python的运行速度如何超过C和C++;?
我制作了一个简单的程序,只在屏幕上打印100万个数字,python大约需要5.2秒。 我认为C和C++应该更快,但每次运行时,它们都需要大约8秒。它们比python慢多少 python代码:python的运行速度如何超过C和C++;?,python,c++,c,performance,performance-testing,Python,C++,C,Performance,Performance Testing,我制作了一个简单的程序,只在屏幕上打印100万个数字,python大约需要5.2秒。 我认为C和C++应该更快,但每次运行时,它们都需要大约8秒。它们比python慢多少 python代码: import time start = time.time() i = 0 while i < 1000000: print(i) i += 1 time_taken = time.time() - start print(("Program took %s seconds."
import time
start = time.time()
i = 0
while i < 1000000:
print(i)
i += 1
time_taken = time.time() - start
print(("Program took %s seconds." % (time_taken)))
程序耗时60.77405118942261秒
python的内置函数是如何比普通版本的程序运行得慢的?除了最后一种情况(见下文)之外,本测试中的计时基本上是您正在使用的控制台应用程序,而不是C/C++/python程序本身
If you redirect the output, you'll find a huge difference:
$ time ./loop >/dev/null
real 0m0.096s
user 0m0.092s
sys 0m0.004s
$ time ./loop >/tmp/million.txt
time ./loop >/tmp/million.txt
real 0m0.116s
user 0m0.078s
sys 0m0.019s
$ time ./loop
0
1
# ...Many lines of output not included
999998
999999
real 0m6.465s
user 0m0.202s
sys 0m0.708s
上一个Python示例之所以如此缓慢,是因为您使用了*range(1000000)
将生成器显式展开为一百万个参数,以打印
。这迫使Python创建大量的列表,并且它没有针对特定情况进行优化。最好用发电机发电
我怀疑初始Python计时和C计时之间的差异是测试方法的一个假象。第一种方法使用Python来测量时间,这意味着它测量从程序启动到Python完成向控制台发送数据的时间。但是,您可能使用
time
命令对C程序计时,这意味着您正在测量直到最后一行实际输出到控制台的时间。由于涉及到较大的内核缓冲区,因此差异将非常大。尝试使用time
为两个程序计时;当我做的时候,差异消失了。你在C++版本中为每个单个的数字刷新缓冲区。使用'\n'
而不是std::endl
。但是它是以IO为主的,所以不要期望一种语言比另一种语言快得多。@rici:我怀疑这会有很大的不同printf
未编译,这将占用大部分时间。@chepner:这是python 3和OP writed*范围(1000000)它将生成器显式地展开为一个非常长的参数列表。@KerrekSB百万分之200+的数字不会导致30-40%的加速。下层选民:仅仅因为提问者不完全理解他们测试方法的后果,这并不是一个坏问题。提问是完全合法的,答案可能对其他人有所帮助。依我拙见
#include<iostream>
using namespace std;
int main()
{
for( int i = 0 ; i < 1000000 ; ++i)
cout<<i<<endl;
}
import time
start = time.time()
print(*range(1000000))
time_taken = time.time() - start
print(("Program took %s seconds." % (time_taken)))
If you redirect the output, you'll find a huge difference:
$ time ./loop >/dev/null
real 0m0.096s
user 0m0.092s
sys 0m0.004s
$ time ./loop >/tmp/million.txt
time ./loop >/tmp/million.txt
real 0m0.116s
user 0m0.078s
sys 0m0.019s
$ time ./loop
0
1
# ...Many lines of output not included
999998
999999
real 0m6.465s
user 0m0.202s
sys 0m0.708s