为什么python在for循环中击败c ++?

时间:2018-08-03 23:32:03

标签: python c++

这是我的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循环。

1 个答案:

答案 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字节,并将其编码为无操作。