为什么与Java或C#中的相同算法相比,Python中的这种原始筛子这么慢? - java

我正在尝试为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调用这些例程,假设您精通快速语言,这实际上是一件容易的事。

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…