python的运行速度如何超过C和C++;?

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."

我制作了一个简单的程序,只在屏幕上打印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." % (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