簡體   English   中英

與Java或C#中的相同算法相比,為什么在Python中這種主要篩子這么慢?

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

我正在嘗試為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素數上。

在各種基准測試中,就其價值而言,取決於問題,Python的速度是Java的兩倍,甚至比Java慢50倍。 這在很大程度上是由於Python被解釋,而Java被編譯(即使不是本機)。 Ruby發布的分數與Python類似。

語言設計還為Java和C#提供了一些優勢。

除了更有效的Python方法外,還有兩種加快速度的好方法:使用pypy,它實際上類似於Java來對python進行字節編譯,或者以更快的語言(例如C)編寫關鍵部分,然后從Python調用這些例程,假設您精通快速語言,這實際上是一件容易的事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM