Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C++;运行速度比Python慢?_Python_C++_Performance_Delay_Primes - Fatal编程技术网

为什么C++;运行速度比Python慢?

为什么C++;运行速度比Python慢?,python,c++,performance,delay,primes,Python,C++,Performance,Delay,Primes,我最近用Python编写了一个程序,计算1000000以下的素数,并将它们放入一个列表,primelist。这是: import math import time max = 1000000 intlist = [] iflist = [] primelist = [2] sqrt = round(math.sqrt(max)) counter = 3 start = time.clock() while (counter < max) : intlist.appe

我最近用Python编写了一个程序,计算1000000以下的素数,并将它们放入一个列表,
primelist
。这是:

import math

import time

max = 1000000

intlist = []

iflist = []

primelist = [2]

sqrt = round(math.sqrt(max))

counter = 3

start = time.clock()

while (counter < max) :

  intlist.append(counter)

  iflist.append(0)

  counter += 2

counter = 0

counter2 = 0


while intlist[counter] < sqrt:



  if (iflist[counter] == 0):


    current = intlist[counter]


    counter2 = counter + current

    while (counter2 < len(iflist)):

        iflist[counter2] = 1

        counter2 += current

  counter += 1



counter = 0


while counter < len(iflist):

  if iflist[counter] == 0:

        primelist.append(intlist[counter])

  counter += 1



print(time.clock() - start)
#include "stdafx.h"

#include <iostream>
#include <vector>
#include <math.h>
#include <time.h>


using namespace std;

int main()
{

    auto start = clock();

    int max = 1000000;
    int squareroot = ceil(sqrt(max));

    int current = 0;

    vector<int> primelist = { 2 };

    vector<int> sieve;

    vector<bool> conditions;

    vector<int> primes;

    for (int n = 3; n < max; n += 2) {

        sieve.push_back(n);

        conditions.push_back(0);

    }

    for (int n = 0; sieve[n] < squareroot; n++) {

        if (conditions[n] == 0) {

            current = sieve[n];

            for (int x = n + current; x < conditions.size(); x += current) {

                conditions[x] = 1;

            }


        }
    }

    for (int n = 0; n < conditions.size(); n++) {

        if (conditions[n] == 0) {

            primes.push_back(sieve[n]);

        }
    }

    /*for (int n = 0; n < primes.size(); n++) {

        cout << primes[n] << endl;

    }*/

    cout << clock() - start << endl;

}
导入数学
导入时间
最大值=1000000
intlist=[]
iflist=[]
primelist=[2]
sqrt=四舍五入(数学sqrt(最大))
计数器=3
开始=时间。时钟()
而(计数器<最大值):
intlist.append(计数器)
iflist.append(0)
计数器+=2
计数器=0
计数器2=0
当intlist[计数器]
这一方案绝不是优化的;这只是埃拉托什尼筛的一个基本实现

最近我决定学习C++中的代码。我把我的Python代码直接翻译成C++,这里是:

import math

import time

max = 1000000

intlist = []

iflist = []

primelist = [2]

sqrt = round(math.sqrt(max))

counter = 3

start = time.clock()

while (counter < max) :

  intlist.append(counter)

  iflist.append(0)

  counter += 2

counter = 0

counter2 = 0


while intlist[counter] < sqrt:



  if (iflist[counter] == 0):


    current = intlist[counter]


    counter2 = counter + current

    while (counter2 < len(iflist)):

        iflist[counter2] = 1

        counter2 += current

  counter += 1



counter = 0


while counter < len(iflist):

  if iflist[counter] == 0:

        primelist.append(intlist[counter])

  counter += 1



print(time.clock() - start)
#include "stdafx.h"

#include <iostream>
#include <vector>
#include <math.h>
#include <time.h>


using namespace std;

int main()
{

    auto start = clock();

    int max = 1000000;
    int squareroot = ceil(sqrt(max));

    int current = 0;

    vector<int> primelist = { 2 };

    vector<int> sieve;

    vector<bool> conditions;

    vector<int> primes;

    for (int n = 3; n < max; n += 2) {

        sieve.push_back(n);

        conditions.push_back(0);

    }

    for (int n = 0; sieve[n] < squareroot; n++) {

        if (conditions[n] == 0) {

            current = sieve[n];

            for (int x = n + current; x < conditions.size(); x += current) {

                conditions[x] = 1;

            }


        }
    }

    for (int n = 0; n < conditions.size(); n++) {

        if (conditions[n] == 0) {

            primes.push_back(sieve[n]);

        }
    }

    /*for (int n = 0; n < primes.size(); n++) {

        cout << primes[n] << endl;

    }*/

    cout << clock() - start << endl;

}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
自动启动=时钟();
int max=1000000;
int平方根=ceil(sqrt(max));
int电流=0;
向量素数表={2};
向量筛;
矢量条件;
向量素数;
对于(int n=3;n
python中的time.clock以浮点秒为单位

< C++中的时钟是单击(每个机器都是不同的,但每台机器都有“时钟”,“PySSEC”)< /P> 在C++中,我将输出线修正为

auto t=clock()-启动;

你能测试调试版本还是发布版本吗?调试版本是为调试逻辑而设计的,速度会非常慢。还有一个关于
vector
的警告。它是为节省空间而设计的,在许多其他地方都是以牺牲成本为代价的。此外,调用
reserve(max)会带来一些改进
在开始的时候,在你的每个向量上……他所说的。
std::vector
是一个陷阱。@user4581301•应该有一个经过空间优化的bool_向量。:-/我想他明白,如果他在我的机器上执行相同的程序测量方式不同,我会在这个答案中附加以秒为单位的时间。我想这是误解了因为所提到的问题是通过程序的输出判断的,在c程序中不是秒。我在VS中得到的结果与他在debug下声称的结果相似。
std::
集合在调试构建中的速度慢得可笑。我认为clock()的输出以毫秒为单位?我如何转换“点击”呢到秒数?@AnishShanbhag-除以
每秒时钟数
,但可能是毫秒。