- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在任何人开始之前,我知道在编程语言中谈论“速度”并不总是最……有用的讨论。也就是说,速度是这里的问题。
我解决了 Project Euler problem 5在这两种语言中,虽然我在这两种语言中的实现看起来非常相似,但运行时却大不相同。 Java 仅需几秒钟即可返回答案,而 Python 最多可能需要一分钟(当然,在同一台机器上)。我很确定这不是 Python 的错,而是一个还没有完全学会用 Python 方式思考的程序员(我)的错。
请注意,我并不是要您重写我的代码。我只是想在正确的方向上寻找一些插入力。 (是的,我看过 some similar threads,但其中大部分都在我的脑海中,并没有直接比较两种语言的相同算法。This thread 很有帮助,但同样,没有不要直接比较 Java 和 Python - 坦率地说,答案有点难以理解。)
事不宜迟:
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;
}
}
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 是一种动态类型的语言,而 Java 是一种静态类型的语言。这意味着 Java 在编译时有更容易获得的关于变量类型的信息,特别是数字。 Java 的设计者花费了大量的精力来定义 JVM,使得 32 位(int
)和 64 位算术(long
)计算可以高效地工作方式。
另一方面,Python 没有变量类型声明,因此 x
等变量可以容纳任何对象。在你的情况下,碰巧它们总是保存数字,但 CPython 的编译器不会去验证它。当 Python 执行您的代码时,评估诸如 number % x
的表达式涉及为 number
表示的对象查找 %
运算符,调用%
运算符,获取 x
的类型,确保它是一个兼容的数字类型,等等。这一切都需要时间,尤其是当你做无数次的时候。
PyPy 等替代 Python 实现会竭尽全力尝试确定变量的类型。在您的情况下,它可以确定 number
和 x
始终引用 integers,并生成不需要的适当的低级代码检查类型。
最后,您可能想要查找 Least common multiple以更快的方式用任何语言解决这个 Project Euler 问题。与欧拉计划问题一样,最快的解决方案不是通过编写更快的代码找到的,而是通过选择合适的算法找到的。
关于java - 如何使这个 Project Euler 解决方案在 Python 中以与 Java 相同的速度执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9171457/
我正在尝试将欧拉旋转顺序从现有的 xyz 转换为 zxy。谁能帮我做这件事?谢谢。 编辑:我发现这篇非常有用的文章,认为它可以帮助其他人在同一条道路上 - http://knol.google.com
考虑修改后的欧拉问题 #4——“找出最大回文数,它是 100 到 9999 之间的两个数字的乘积。” rev :: Int -> Int rev x = rev' x 0 rev' :: Int ->
例如,我如何在 R 中输入值 e^2? 最佳答案 R 表达式 exp(1) 代表e,并且 exp(2) 代表e^2。 这是有效的,因为 exp 是以 e 为底的求幂函数。 关于R编程: How do
我正在尝试了解 Euler Tour 算法以及为什么它在树遍历中很受欢迎。但是,我看不出 Euler Tour 和树的预序遍历之间的区别。 假设你有一棵树: A / \ B
我一直在尝试对 Euler #22 问题中的这些名称进行排序。我尝试了很多方法来交换字符串。我每次都有问题。有些是随机的符号;有些是随机的。在其他情况下,我在交换时出现了溢出(?)的名字(就像在尝试交
我想为游戏创建一些 physx,我从小例子开始了解它是如何工作的。在此期间我遇到了一些问题,但我在 90% 内解决了它们。 为了创建我的示例,我研究了一些其他示例并创建了我使用的示例:codeflow
/* The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 60
我正在研究 Problem 8 of Project Euler我必须从给定的 1000 位数字中找到 13 个连续数字的最大乘积。我将该数字存储在一个文本文件中,然后将其输入到我的源代码中。我的代码
我目前正在尝试解决二体问题,然后我可以升级到更多行星,但它不起作用。它正在输出我不可能的位置。有谁知道是什么原因造成的? 这是我使用的代码: day = 60*60*24 # Constants G
我最近一直在研究毕达哥拉斯三元组和 Euler Bricks并且想知道生成所有这些的最佳方法是什么。 我从更广泛的阅读中知道有 10 个 c n: break
在我当前的 Project Euler problem 5 ,我有一个“有效”的解决方案。它适用于较小的数字(问题中的示例),但不适用于实际问题,因为我在强行使用它,并且程序没有完成。 问题的解释如下
基于标准定义,Eulerian Path是图中的一条路径,它恰好访问每条边一次。 现在,我试图在有向图中找到欧拉路径。我知道欧拉电路的算法。如果一个图有欧拉回路,它就有欧拉路径,这似乎是微不足道的。
我正在研究项目欧拉程序是为了“启蒙”,而不仅仅是解决它们。我已经在 80x80 矩阵上使用动态程序解决了问题 81,但是当我尝试使用统一成本搜索解决它时,我的程序消失在永无止境。我只想知道使用统一成本
我有一个关于 Project Euler 问题和使用循环展开优化的问题。 问题描述:2520是能被1到10的每一个数整除而没有余数的最小数。能被 1 到 20 的所有数字整除的最小正数是多少? 解决方
我正在使用以下行旋转 SCNNode: let rotate = SCNAction.rotateByAngle(CGFloat(M_PI), aroundAxis:SCNVector3Make(0
我想获得更精确的 1/7,但它被截断了。如何在转换有理数时获得更好的精度? >>> str(1.0/7)[:50] '0.142857142857' 最佳答案 Python 有一个用于任意精度计算的内
我正在处理项目 euler 中的问题 401,我在 python 中编写了我的解决方案,但它需要几天时间才能运行,显然我需要加快速度或使用不同的方法。我在 Haskell 中遇到了一个看起来与我的 p
我正在处理 Project Euler 的第四个问题并且遇到了 stackoverflow 异常。我不是在寻求解决问题的帮助,我只是想解释为什么我会收到 stackoverflow 异常。这通常是因为
我已经做了几天 Euler 项目,我不得不承认它很有趣。但是,如果有一些更专注于计算机科学而不是数学的东西,那就太好了。这样的事情对于练习算法和数据结构会很有趣,例如在准备编码面试时。 最佳答案 您可
13195 的质因数是 5、7、13 和 29。 数字 600851475143 的最大质因数是多少? 我自己在Project Euler上解决了这个问题,很慢,后来在某人的github账号上找到了这
我是一名优秀的程序员,十分优秀!