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

Azn*_*ide -1 c++ python

这是我的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
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

为什么PYTHON在这种情况下更快?我不确定是不是因为我写了额外的代码,但它似乎是一个非常基本的循环.

aba*_*ert 11

这不是for循环慢,而是C++ iostreams.它甚至iostreams不是非常缓慢,1但是你正在endl为每一行做一个.

C++ endl不仅仅是'\n'它的同义词,它是一个io操纵器对象,当插入到流中时,插入'\n' 然后要求刷新流.刷新标准输出可能非常慢.

print另一方面,Python 不会刷新,除非你明确要求它; 否则,它只是写入sys.stdout,这是一个TextIOWrapper在缓冲区中积累的东西,并在它认为合适时刷新,这与C++完全相同iostreams.2

为了公平测试,请比较一下:

    cout << "Test\n";

    print("Test")
Run Code Online (Sandbox Code Playgroud)

… 或这个:

    cout << "Test" << endl;

    print("Test", flush=True)
Run Code Online (Sandbox Code Playgroud)

1.某些平台/编译器/优化的标志,它是相当缓慢.操纵者可能特别慢.因此,在解决此问题后,Python 仍可能胜过C++.但不是按11:1的比例.

2. Python还必须将您的字符串从Unicode转换为sys.stdout.encoding.但是,如果您使用的是3.4或更高版本,则所有类似ASCII的Unicode字符串都'test'将存储为ASCII字节,并对其进行编码即为无操作.