Swift比C和Python代码慢1000倍?

时间:2016-04-24 20:00:37

标签: python c swift

我是swift的新手,我经常在项目euler上解决一些问题,以熟悉一种新语言。

问题7是一个很好的例子,所以我会发布我的代码,我试着几乎以同样的方式编写它们......

的Python ....

def is_prime(x):
    div_by = [i for i in range(2, int(x ** 0.5) + 1)]
    for i in div_by:
        if x % i == 0:
            break
    else:
        return True

primes = 0
test = 2
while True:
    if is_prime(test):
        primes += 1
    if primes == 10001:
        break
    test += 1

print('the 10001st prime:', test)
print('finished in:', time.clock() - start_time, 'seconds')

输出:

('the 10001st prime:', 104743)
('finished in:', 1.8959460000000001, 'seconds')

...ç

int is_prime(int num)
{
    int sqrtDiv = lround(sqrt(num));
    while (sqrtDiv > 1) {
        if (num % sqrtDiv == 0) {
            return(0);
        } else {
            sqrtDiv--;
        }
    }
    return(1);
}

int main () 
{
    clock_t start = clock();

    int primes = 0;
    int numbers = 2;
    while (primes < 10001) {
        if (is_prime(numbers)) {
            primes+= 1;
        }
        numbers += 1;
    }
    //Had to do -1 at the end because I added one to numbers after every loop, even when it found the last prime.
    printf("The 10,001st prime number is: %d\n", numbers - 1);


    clock_t end = clock();
    double time_elapsed_in_seconds = (end - start)/(double)CLOCKS_PER_SEC;
    printf("Finished in %f seconds.\n", time_elapsed_in_seconds);   

}

输出:

The 10,001st prime number is: 104743
Finished in 0.056207 seconds.

...夫特

public func is_prime(num:Int) -> Bool {
    let sq = sqrt(Double(num))

    for i in 2...Int(sq) + 1 {
        if num % i == 0 {
            return false
        }
    }
    return true

}

public func problem7() {
    var primes:Int = 1
    var next:Int = 3

    while primes < 10001 {
        if is_prime(next) {
            primes += 1
        }
        next += 1
    }
    print("THe 10,001st prime is: ", next - 1)
}

我甚至没有时间,但是它在几分钟的范围内......为什么会这么慢,是不是意味着做这种事情?我做错了什么,或者这就是它的样子?

1 个答案:

答案 0 :(得分:2)

Swift编译器假设您不关心生成的代码运行速度有多慢,除非您请求某些编译器优化,例如通过设置编译器标志,例如-Ofast

否则,Swift编译器似乎会在编译结果中添加一公吨额外和慢速的机器代码,可能有助于调试。