Вот две программы, которые наивно вычисляют количество простых чисел < = 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
Запуск их на п = 10000 я получаю следующие тайминги.
оболочки: ~ $ время питон prime.py 10000 & & время ява премьер 10000
реальные 0m49.833s
пользователя 0m49.815s
SYS 0m0.012s
real 0m1.491s
пользователь 0m1.468s
sys 0m0.016s
Я использую для петель в python неправильно здесь или это python на самом деле это намного медленнее?
Я не ищу ответа, специально созданного для вычисления простых чисел, но мне интересно, если код python обычно используется умнее.
код Java был скомпилирован с JAVAC 1.6.0_20
Запуск с Java версии "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.1) (6b18-1.8.1-0ubuntu1 ~ 9.10.1) OpenJDK Client VM (сборка 16.0-b13, смешанный режим, обмен)
Питон:
Python 2.6.4 (r264: 75706, 7 декабря 2009, 18:45:15)
Одна очевидная вещь, которую вы, возможно, захотите сделать, это изменить 'range' на' xrange' - должна немного изменить использование памяти, возможно, и скорость. – Kos
В общем, достаточно разделить 'i' номерами до квадратного корня из' i'. И, вероятно, даже лучше было бы [Сито Эратосфена] (http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes), но это не вопрос вопроса;) –
Вместо «для i в диапазоне (a, b) doStuff(); " попробуйте что-то вроде «i = a; while (i <= b) {doStuff(); i = i + 1}" –