与 Java 或 C# 中的相同算法相比,为什么这个素筛在 Python 中这么慢?

Why is this prime sieve so slow in Python compared with the same algorithm in Java or C#?

我正在尝试为项目 Euler 解决方案构建一个筛子。 我需要 prime 直到大约 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 秒...

所以,这个post和其他post不同的是,我不想知道算法是如何实现的,我想了解为什么在[=24中这么慢=].

一些印刷品告诉我大约 50% 的时间花在寻找前 100K 个素数上。

在各种基准测试中,就它们的价值而言,Python 的速度从相同到比 Java 慢 50 倍不等,具体取决于问题。这主要是由于 Python 被解释,并且 Java 被编译(即使不是本地的)。 Ruby 发布的分数与 Python 相似。

语言设计也给了Java和C#一些优势。

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