在任何人开始之前,我都知道在编程语言中谈论“速度”并不总是最有用的讨论。就是说,速度是这里的问题。
我用两种语言处理了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/