9/21/2008

Python和JAVA 速度比较一例

接上次的素数判断问题,python的速度令人不敢恭维:
算法:查找1000000内有多少个素数的最“朴素”的算法。
说明:查找1000000内是因为,时间....

JAVA 代码和测试结果:
[coolcode lang="java" linenum="off"]
public class timetest {
int is_prime(int n) {
//long lim = (int) Math.sqrt(n);
int t =(int) (Math.sqrt(n)+1);
for (int i = 2; i<= t; i++) {
if (n % i == 0)
return 0;

}
return 1;
}

public static void main(String[] args) {
long start = System.currentTimeMillis();
timetest prime = new timetest();
int i, count = 0;
for (i = 1; i < 1000000; i++)
count += prime.is_prime(i);
System.out.println("Total of %d primes\n" + count);
System.out.println("用时毫秒:" + (System.currentTimeMillis() - start));
// }

}
}
[/coolcode]
测试结果:
Total of %d primes
78498
用时毫秒:1156

Python算法和结果:
[coolcode lang="python" linenum="off"]
def is_prime(n):
t=int(math.sqrt(n))+1
for i in xrange(2,t+1):
if(n%i==0):
return 0;
return 1

def test_compare_with_java():
start=time.time()
total=0
for i in xrange(1,1000000):
total+=is_prime(i)
print total
print time.time()-start

test_compare_with_java()
[/coolcode]

测试结果
78498
18.1880002022 (秒为单位)

凄凉吧......
P.S. 都是windows2000上的执行结果,据说linux会快一点.

4 评论:

匿名,  2008年10月29日 14:37  

我觉得该是算法优先,而不是语言优先,而且据说‘在程序内部记录起止时间的方式是不准确的,建议使用time命令取进程的用户时间作为程序运行时间’:-)

匿名,  2008年11月13日 06:22  

5ih65E ystwlaoukwym, [url=http://vvhrowxlwgrt.com/]vvhrowxlwgrt[/url], [link=http://hgfmlgqznhve.com/]hgfmlgqznhve[/link], http://yzmiqtnduqhn.com/

William 2009年3月22日 09:36  

脚本语言速度的问题是没有办法的。Java是一种编译型的语言,编程成字节码。执行的时候,VM会把字节码文件load进内存,转为机器本地代码。这个过程还会对本地代码进行优化。优化后的二进制代码在执行期会常驻内存。
而Python是一种脚本语言,被虚拟机解释执行的。
用解释执行的脚本语言来和即时编译型语言来比速度,本身就不公平啊。
脚本语言的优势在于轻量,编写时的快捷---它们本来就不追求速度嘛。
Python之类的脚本如果采用Java那样的即时编译+优化,速度也不差的。典型的例子是Chrome浏览器执行JavaScript

William 2009年3月30日 19:38  

Google 开发Python的JIT了。
Python的速度即将飙起来

发表评论