python - 优化 python for 循环

标签 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

在 n=10000 上运行它们,我得到以下计时。
shell:~$ time python prime.py 10000 && time java prime 10000
1230

真正的 0m49.833s
用户 0m49.815s
系统 0m0.012s
1230

真正的 0m1.491s
用户 0m1.468s
系统 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 Client VM(build 16.0-b13,混合模式,共享)

Python 是:
Python 2.6.4(r264:75706,2009 年 12 月 7 日,18:45:15)

最佳答案

正如已经指出的那样,纯 Python 真的不是为这类事情而生的。素数检查算法是朴素的也不是重点。然而,通过两件简单的事情,我能够在使用原始算法的同时大大减少 Python 的时间。

首先,将所有内容放入一个函数中,将其命名为 main() 或其他名称。这将我机器上使用 Python 的时间从 20.6 秒减少到 14.54 秒。在全局范围内做事比在函数中做事慢。

其次,使用 Psyco,一个 JIT 编译器。这需要在文件顶部添加两行(当然还需要安装 psyco):

import psyco
psyco.full()

这使最终时间达到 2.77 秒。

最后一点。我决定在此基础上使用 Cython,并将时间降至 0.8533。但是,我不建议普通用户了解如何进行少量更改以使其成为快速的 Cython 代码。

关于python - 优化 python for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169828/

相关文章:

python - 结合 shell 和 python 代码

python - 使用 .loc 和多个条件从 DataFrame 中选择行,然后显示与一列的最小值/最大值对应的行

python - 如何将此 json 对象转换为 pandas 数据框?

python - 在 python 项目中不使用 __init__.py 文件是一种不好的做法吗?

python - 如何运行 Luigi Pipeline 的并行实例 : Pid set already running

python - 如何递归检查对象中的属性?

python - Tkinter checkbuttons 默认在 Mac 上显示减号

python - 如何让 Python apscheduler 在后台运行

python - psycopg2 传入表名

python - 使用 Python 快速解析一个巨大的 12 GB JSON 文件