这是两个程序,天真地计算素数<= n.
一个是Python,另一个是Java.
public class prime{
public static void main(String args[]){
int n = Integer.parseInt(args[0]);
int nps = 0;
boolean isp;
for(int i = 1; i <= n; i++){
isp = true;
for(int k = 2; k < i; k++){
if( (i*1.0 / k) == (i/k) ) isp = false;
}
if(isp){nps++;}
}
System.out.println(nps);
}
}
`#!/usr/bin/python`
import sys
n = int(sys.argv[1])
nps = 0
for i in range(1,n+1):
isp = True
for k in range(2,i):
if( (i*1.0 / k) == (i/k) ): isp = False
if isp == True: nps = nps + 1
print nps
Run Code Online (Sandbox Code Playgroud)
在n = 10000上运行它我得到以下时间.
shell:〜$ time python prime.py 10000 && time java prime 10000
1230
实际0m49.833s
用户0m49.815s
sys 0m0.012s
1230
实际0m1.491s
用户0m1.468s
sys 0m0.016s
我在python中以不正确的方式使用for循环或者python实际上只是这么慢吗?
我不是在寻找专门用于计算素数的答案,而是我想知道python代码是否通常以更智能的方式使用.
Java代码使用javac编译1.6.0_20
使用java版本"1.6.0_18"
运行OpenJDK运行时环境(IcedTea6 1.8.1)(6b18-1.8.1-0ubuntu1~9.10.1)OpenJDK客户端VM(版本16.0-b13,混合模式,分享)
Python是:
Python 2.6.4(r264:75706,2009年12月7日,18:45:15)
正如已经指出的那样,直接Python真的不是为了这种事情.主要检查算法是天真的也不是重点.但是,通过两个简单的事情,我可以在使用原始算法时大大减少Python的时间.
首先,将所有内容放在函数内部,调用它main()或其他东西.这使我的机器在Python上的时间从20.6秒减少到14.54秒.全局做事比在函数中做得慢.
其次,使用JIT编译器Psyco.这需要在文件顶部添加两行(当然还安装了psyco):
import psyco
psyco.full()
Run Code Online (Sandbox Code Playgroud)
这使最后时间达到2.77秒.
最后一点.我决定在此使用Cython并将时间降至0.8533.但是,知道如何进行一些更改以使其快速Cython代码不是我推荐给临时用户的东西.