与Java或C#中的相同算法相比,为什么在Python中这种主要筛子这么慢?

时间:2018-07-02 11:03:28

标签: java python performance primes sieve-of-eratosthenes

我正在尝试为Euler项目解决方案建立一个筛子。 我需要预充至大约100M,最好选择更高的充值。

我拥有的此实现效果很好,但是非常慢:

class Primes:
__size = None
__sieve = []
__primes = []

def __init__(self, size):
    self.__size = size
    self.__sieve = [True] * size
    for x in range(2, size):
        if self.__sieve[x]:
            self.foundPrime(x);

def foundPrime(self, x):
    self.__primes.append(x)
    for duplicate in range(2 * x, self.__size, x):
        self.__sieve[duplicate] = False

对于大小为100M的筛子,此初始化在我相当高端的计算机上大约需要70秒。有人知道为什么吗?因为在Java和C#中,这花了我大约1秒钟的时间...

因此,本篇文章与其他文章的不同之处在于,我不想知道如何实现该算法,我想了解为什么它在Python中如此之慢。

一些印刷品给我的信息是,大约有50%的时间都花在寻找最初的100K素数上。

1 个答案:

答案 0 :(得分:0)

在各种基准测试中,就其价值而言,取决于问题,Python的速度是Java的两倍,甚至比Java慢50倍。这在很大程度上是由于Python被解释,而Java被编译(即使不是本机)。 Ruby的评分与Python相似。

语言设计还为Java和C#提供了一些优势。

除了更有效的Python方法外,还有两种加快速度的好方法:使用pypy(类似于Java,本质上是对python进行字节编译),或者以更快的语言(例如C)编写关键部分,然后调用这些例程从Python开始,假设您精通快速语言,这项任务实际上非常容易。