这是我的c ++代码:
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;
int main() {
clock_t end;
clock_t start = clock();
for(int i = 0; i < 1000; i++) {
cout << "Test" << endl;
}
end = clock() - start;
double duration = end / (double) CLOCKS_PER_SEC;
cout << "Duration: " << duration << endl;
getchar();
return 0;
} // This takes around ~ .9 secs on average
这是我的python代码:
import time
def foo():
start = time.time()
for i in range(1000):
print('Test')
print('Duration: {}'.format(time.time()-start))
# This takes around ~ .08 secs on average
为什么在这种情况下PYTHON更快?我不确定是否是因为我是否编写了额外的代码,但这似乎是一个非常基本的for循环。
答案 0 :(得分:11)
不是缓慢的for
循环,而是C ++ iostreams
。甚至不是iostreams
太慢了, 1 ,而是您在每一行都做了endl
。
C ++ endl
不仅是'\n'
的同义词,它还是一个io操纵器对象,当插入到流中时,它会插入'\n'
然后请求该流刷新。刷新标准输出可能非常慢。
Python print
不会刷新,除非您明确要求它。否则,它只会写入sys.stdout
,这是一个TextIOWrapper
,它将内容堆积在缓冲区中,并在认为合适时进行刷新,这几乎与C ++ iostreams
所做的相同。 sup> 2
要进行公平的测试,请对此进行比较:
cout << "Test\n";
print("Test")
…或这个
cout << "Test" << endl;
print("Test", flush=True)
1。使用某些平台/编译器/优化标志, 非常慢。机械手的速度可能特别慢。因此,在解决此问题后,Python可能会仍然击败C ++。但不是以11:1的比例。
2。 Python还必须将您的字符串从Unicode转换为sys.stdout.encoding
。但是,如果您使用的是3.4或更高版本,则将像'test'
之类的全是ASCII的Unicode字符串存储为ASCII字节,并将其编码为无操作。