サムネがコーヒーの記事は書きかけです。

Javaとpythonの速度比較(素数生成プログラム)

今回はn番目までの素数をリストに格納し続けるプログラムを使用してpythonとJavaの速度の比較をしていきます。

素数生成

コードが長くなるのでエラトステネスの篩は使わずに、素数判定の探索範囲をsqrt(num)にして無駄な処理を省きます。

Python

Python + 通常配列

import math
import time
class Prime:
    def __init__(self,n) -> None:   
        self.n = n
        self.array = []
        pass

    def isPrime(self,num):
        i = 2
        while i<=math.sqrt(num):
            if num%i == 0:
                return False
            i += 1 
        return True

    def calcPrimeN(self):
        i = 0
        num = 2
        while i != self.n:
            if self.isPrime(num):
                self.array.append(num)
                i += 1
            num +=1
        print(self.array)
        return self.array(self.n-1)


t0 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
prime = Prime(10000)
print(prime.calcPrimeN())
t1 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
print(t1-t0)

実行結果

104729
477429000(ns)

Python リスト初期化

最初にテーブルを初期化しておきます。

import math
import time
class Prime:
    def __init__(self,n) -> None:   
        self.n = n
        self.array = [0 for i in range(n)]
        pass

    def isPrime(self,num):
        i = 2
        while i<=math.sqrt(num):
            if num%i == 0:
                return False
            i += 1 
        return True

    def calcPrimeN(self):
        i = 0
        num = 2
        while i != self.n:
            if self.isPrime(num):
                self.array[i] = num
                i += 1
            num +=1
        return self.array[self.n-1]


t0 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
prime = Prime(10000)
print(prime.calcPrimeN())
t1 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
print(t1-t0)

実行結果

104729
428623000(ns)

Appendよりも気持ち速い気がします。

Java

Java+通常配列

多分これが一番高速です(であって欲しい。)

class Prime {
    int[] prime ;
    int n;

    public Prime(int n){
        prime = new int[n];
        this.n = n;
    }
    public static void main(String[] args){
        double t0 = System.nanoTime();
        Prime prime = new Prime(10000);
        prime.calcPrime();
        System.out.println(prime.prime[prime.n-1]);
        double t1= System.nanoTime();
        System.out.println(t1-t0);

    }
    public void calcPrime(){
        int inserted = 0;
        int num = 2;
        while (inserted != n){
            if (isPrime(num)){
                prime[inserted] = num;
                inserted +=1;
            }
            num += 1;
        }
    }

    public static boolean isPrime(int num){
        for (int i = 2;i<=Math.sqrt(num);i++){
            if (num%i ==0){
                return false;
            }
        }
        return true;
    }
}

Pythonの100倍くらい速いです。

104729
5809208.0(ns)

Java + ArrayList

ArrayListクラスを使用します。

import java.util.ArrayList;
class Prime {
    ArrayList<Integer> prime = new ArrayList<>();
    int n;

    public Prime(int n){
        this.n = n;
    }
    public static void main(String[] args){
        double t0 = System.nanoTime();
        Prime prime = new Prime(10000);
        prime.calcPrime();
        System.out.println(prime.prime.get(prime.n-1));
        double t1= System.nanoTime();
        System.out.println(t1-t0);

    }
    public void calcPrime(){
        int inserted = 0;
        int num = 2;
        while (inserted != n){
            if (isPrime(num)){
                prime.add(num);
                inserted +=1;
            }
            num += 1;
        }
    }

    public static boolean isPrime(int num){
        for (int i = 2;i<=Math.sqrt(num);i++){
            if (num%i ==0){
                return false;
            }
        }
        return true;
    }
}

実行結果

104729
7037875.0(ns)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です