优化python for循环

fth*_*ker 5 python

这是两个程序,天真地计算素数<= 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)

Jus*_*eel 9

正如已经指出的那样,直接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代码不是我推荐给临时用户的东西.