在任何人开始之前,我都知道在编程语言中谈论“速度”并不总是最有用的讨论。就是说,速度是这里的问题。

我用两种语言处理了Project Euler problem 5,虽然两种语言的实现看起来都非常相似,但是运行时却有很大不同。 Java仅需几秒钟即可返回答案,而Python可能需要一分钟的时间(当然,这是在同一台计算机上)。我敢肯定,这不是Python的错,而更多是程序员(我)的错,他们还没有学会用Python来思考。

请注意,我不是要您重写我的代码。我只是在寻找正确方向上的一些小问题。 (是的,我查看了some similar threads,但是其中大多数都超出了我的理解,并且没有直接比较两种语言的相同算法。This thread很有帮助,但同样,也不能直接比较Java和Python-以及坦白说,答案有点难以理解。)

无需再费周折:

java

public class Problem5 {

    public static void main(String[] args){
        boolean found = false;

        for (int i = 20; !found; i += 20){
            if (DivisThrough20(i)) {
                found = true;
                System.out.println(i);
            }
        }
    }

    private static boolean DivisThrough20(int number){
        boolean result = true;
        for (int i = 19; result && i > 1; i--){
            if (number % i != 0) result = false;
        }
        return result;
    }
}

Python
def DivisThroughTwenty(number):
    for x in range(20,1,-1):
        if number % x != 0:
            return False
    return True

# the number we're looking for can't be any lower than 20, so we'll
# start there as a small optimization
testNumber = 20

keepLooking = True

while keepLooking:
    if not DivisThroughTwenty(testNumber):
        testNumber += 20
    else:
        keepLooking = False

print testNumber

有趣的是,并排阅读这些内容,我已经可以看到该算法的Python版本比Java版本稍微优化了一些,但仍然慢得多。我更想找到现在解决该问题的另一种方法。

最佳答案

我不确定这可能有多大帮助,但是您的工作人员代码可以用更加Python化的方式重写,如下所示:

def divis_through_twenty(n):
  return any(n % x for x in xrange(20,1,-1))

x = 20
while divis_through_twenty(x):
  x += 20

print x

如果愿意,您可以对其进行更多优化(例如,如果您已经测试过一个数字可以被20整除,则无需检查该数字是否可以被10、5或2整除)。

关于java - 如何使该Project Euler解决方案在Python中以与Java相同的速度执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9171457/

10-11 01:51
查看更多