メモ_Juliaとpythonで素数探索の速度比較

Julia というプログラミング言語を試してみました。Windows環境にインストールして、Jupyter Lab で実行できるようにセットアップして、素数に関する探索処理をpythonと比較して実行させてみまます。

 

処理内容:

1000万までの自然数に含まれる双子素数、エマープ素数、回文素数をカウントする。

探索結果と処理にかかった時間を表示する。

 

環境:

OS : Windows 11

CPU : Ryzen 7 5825U

MEM : 16GB

Python : 3.10.11

Julia : 1.10.4

Jupyter Lab : 4.2.4

結果:
Julia 1.48秒
Python 16.35秒



やはりjuliaが速いですね。pythonでもnumbaでJIT化すればC言語並みに速くなることもありますが、ライブラリ関連でエラーを起こすことが割りとあるので、手元で長時間の計算をさせる際は julia も良いですね。文法的にもpythonと似ていてスムーズに読み書きできますし。

コード:python

import sympy
import time

def get_primes_up_to(n):
    return list(sympy.primerange(2, n + 1))

def is_twin_prime(prime_list):
    twin_primes = []
    for i in range(len(prime_list) - 1):
        if prime_list[i + 1] - prime_list[i] == 2:
            twin_primes.append((prime_list[i], prime_list[i + 1]))
    return twin_primes

def is_emirp(prime):
    reversed_prime = int(str(prime)[::-1])
    return prime != reversed_prime and sympy.isprime(reversed_prime)

def is_palindrome(prime):
    return str(prime) == str(prime)[::-1]

def find_special_primes(n):
    primes = get_primes_up_to(n)
    
    twin_primes = is_twin_prime(primes)
    emirp_primes = [p for p in primes if is_emirp(p)]
    palindrome_primes = [p for p in primes if is_palindrome(p)]
    
    return twin_primes, emirp_primes, palindrome_primes

def save_to_file(filename, data):
    with open(filename, 'w') as f:
        for item in data:
            f.write(f"{item}\n")

# 使用例
n = 10000000  # ここで指定した自然数までの素数を探します

start_time = time.time()
twin_primes, emirp_primes, palindrome_primes = find_special_primes(n)
end_time = time.time()

save_to_file("twin_primes.txt", twin_primes)
save_to_file("emirp_primes.txt", emirp_primes)
save_to_file("palindrome_primes.txt", palindrome_primes)

print("双子素数の個数: ", len(twin_primes))
print("エマープ素数の個数: ", len(emirp_primes))
print("回文素数の個数: ", len(palindrome_primes))
print("処理にかかった時間: ", end_time - start_time, "秒")
        
    
コード:Julia

using Primes
using Dates

function get_primes_up_to(n)
    return primes(2, n)
end

function is_twin_prime(prime_list)
    twin_primes = []
    for i in 1:length(prime_list) - 1
        if prime_list[i + 1] - prime_list[i] == 2
            push!(twin_primes, (prime_list[i], prime_list[i + 1]))
        end
    end
    return twin_primes
end

function is_emirp(prime)
    reversed_prime = parse(Int, reverse(string(prime)))
    return prime != reversed_prime && isprime(reversed_prime)
end

function is_palindrome(prime)
    return string(prime) == reverse(string(prime))
end

function find_special_primes(n)
    primes = get_primes_up_to(n)
    
    twin_primes = is_twin_prime(primes)
    emirp_primes = [p for p in primes if is_emirp(p)]
    palindrome_primes = [p for p in primes if is_palindrome(p)]
    
    return twin_primes, emirp_primes, palindrome_primes
end

function save_to_file(filename, data)
    open(filename, "w") do f
        for item in data
            write(f, "$item\n")
        end
    end
end

# 使用例
n = 10000000  # ここで指定した自然数までの素数を探します

start_time = now()
twin_primes, emirp_primes, palindrome_primes = find_special_primes(n)
end_time = now()

save_to_file("twin_primes.txt", twin_primes)
save_to_file("emirp_primes.txt", emirp_primes)
save_to_file("palindrome_primes.txt", palindrome_primes)

println("双子素数の個数: ", length(twin_primes))
println("エマープ素数の個数: ", length(emirp_primes))
println("回文素数の個数: ", length(palindrome_primes))
println("処理にかかった時間: ", end_time - start_time, "秒")