Python列表与Java阵列效率

时间:2015-01-04 19:34:16

标签: java python sieve-of-eratosthenes

我来自Java试图学习Python。我首先在Java中使用Sieve of Eratosthenes算法,然后在Python中。我的Java实现运行速度非常快,我可以在大约25秒内找到所有质量不到10亿的素数。我的Python实现可能需要大约2个小时来完成同样的事情。

我在这里包含了两个实现。我的问题是:

  1. 为什么Python implmentation这么慢? (我知道我做错了什么)
  2. Python可以像Java一样快地完成这项工作吗?
  3. 我认为缓慢的中心是在Python实现中使用一个列表,但我对Python来说太新了,不知道如何解决这个问题。

    JAVA:

    /**
     * Creates a boolean array of a specified size with true values at prime indices and
     * false values at composite indices.
     */
    private static boolean[] sieve(int size){
        boolean[] array = new boolean[size];
    
        //Assume all numbers greater than 1 are prime//
        for(int i = 2; i < array.length; i++){ 
            array[i] = true;
        }
    
        //Execute Sieve of Eratosthenes algorithm//
        for(int p = 2; p < size; p = nextPrimeInArray(array, p)){ 
            for(int i = p + p; i < size; i += p){
                array[i] = false; // i.e., mark as composite
            }
        }
    
        return array;
    }
    
    /**
     * Finds the next index in the array that is not marked composite
     */
    public static int nextPrimeInArray(boolean[] array, int p){
    
        do{
            p++;
        }while(p < array.length && !array[p]);
        return p;
    }
    

    PYTHON:

    def getPrimeList(limit):
        """returns a list of True/False values, where list[i] is True if i is prime and False otherwise"""
        primes = []
    
        # Initially assume all numbers in the list are prime
        for i in range(limit):
            primes.append(True)
    
        # Set 0 and 1 to False
        primes[0] = False
        primes[1] = False
    
        for p in range(2, limit):
            for i in range(p + p, limit, p):
                primes[i] = False
            p = nextPrimeInList(primes, p)
        return primes
    
    def nextPrimeInList(list, p):
        """Helper method for getPrimeList that finds the next index in list not marked composite"""
        p += 1
        while p < len(list) and not list[p]:
            p += 1
        return p
    

1 个答案:

答案 0 :(得分:1)

我不是Python方面的专家,但我会尝试给你一个不错的答案。

首先,Python是一种脚本语言,它比任何编译语言(如Java)都慢。例如,无法对循环进行许多优化,并且对于非常大的循环,它可能会降低代码的速度。然而,我知道在Python的某些实现中也存在预编译,并且执行的内容实际上是字节码,就像在Java中一样,所以差异可能不大。

然后,我认为你可以通过从头开始为你的列表分配合适的大小来加速你的Python版本(我相信Python列表实际上就是数组):

 primes = [True] * limit