【发布时间】:2010-11-13 08:07:35
【问题描述】:
这里有两个程序可以天真地计算素数的个数
一个是 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)
【问题讨论】:
-
您可能想要做的一件显而易见的事情是将
range更改为xrange- 应该会对内存使用产生一些影响,可能还会影响速度。 -
一般来说,将
i除以i的平方根就足够了。 Sieve of Eratosthenes 可能更好,但这不是问题的范围;) -
而不是“for i in range(a, b) doStuff();”尝试类似“i = a ; while (i
-
@Laurențiu:Wat?即使这稍微慢一些(我非常怀疑,范围是用 C 编写的),它绝对不是惯用的。
-
@Laurențiu, delnan:不仅如此,代码是错误的。
for i in range(a, b)与while i <= b不一样;与while i < b相同。这会告诉您有关原始建议的所有信息。
标签: python