素数の計算(1)の続き
Juliaの素数計算が遅い原因を絞り込みたい。python3とJuliaを比べると,素数判定のisprimeや範囲指定素数のprimerangeやprimesではともに高速であるが,順序指定素数のprimeにおいて,juliaはpythonの200倍程度時間がかかっている。しかし,同じ範囲の素数は,素数判定や範囲指定素数では高速に計算できているので,juliaのprimeのコードがややこしいことになっているのが問題だと思われる。
python3では,- - - - - - - - - -
from sympy import *
import time
start_time=time.time()
n=179424673
m=10**7
for p in range(n,n+50):
if isprime(p)==1:
print(p)
lap1_time=time.time()
print(list(primerange(n, n+50)))
lap2_time=time.time()
for i in range(m,m+4):
print(prime(i))
end_time=time.time()
print(lap1_time-start_time)
print(lap2_time-lap1_time)
print(end_time-lap2_time)
- - - - - - - - - -
179424673
179424691
179424697
179424719
[179424673, 179424691, 179424697, 179424719]
179424673
179424691
179424697
179424719
0.0050160884857177734
0.002671957015991211
0.5041019916534424
julia1.5.1では
from sympy import *
import time
start_time=time.time()
n=179424673
m=10**7
for p in range(n,n+50):
if isprime(p)==1:
print(p)
lap1_time=time.time()
print(list(primerange(n, n+50)))
lap2_time=time.time()
for i in range(m,m+4):
print(prime(i))
end_time=time.time()
print(lap1_time-start_time)
print(lap2_time-lap1_time)
print(end_time-lap2_time)
- - - - - - - - - -
179424673
179424691
179424697
179424719
[179424673, 179424691, 179424697, 179424719]
179424673
179424691
179424697
179424719
0.0050160884857177734
0.002671957015991211
0.5041019916534424
julia1.5.1では
- - - - - - - - - -
using Primes
function test1(n)
for p in n:n+50
if(isprime(p))
println(p)
end
end
end
function test2(n)
println(primes(n,n+50))
end
function test3(n)
for p in n:n+3
println(prime(p))
end
end
@time test1(179424673)
@time test2(179424673)
@time test3(10^7)
- - - - - - - - - -
179424673
179424691
179424697
179424719
0.000310 seconds (146 allocations: 3.500 KiB)
[179424673, 179424691, 179424697, 179424719]
0.000521 seconds (207 allocations: 8.109 KiB)
179424673
179424691
179424697
179424719
128.789228 seconds (117.41 M allocations: 1.750 GiB, 0.34% gc time)
using Primes
function test1(n)
for p in n:n+50
if(isprime(p))
println(p)
end
end
end
function test2(n)
println(primes(n,n+50))
end
function test3(n)
for p in n:n+3
println(prime(p))
end
end
@time test1(179424673)
@time test2(179424673)
@time test3(10^7)
- - - - - - - - - -
179424673
179424691
179424697
179424719
0.000310 seconds (146 allocations: 3.500 KiB)
[179424673, 179424691, 179424697, 179424719]
0.000521 seconds (207 allocations: 8.109 KiB)
179424673
179424691
179424697
179424719
128.789228 seconds (117.41 M allocations: 1.750 GiB, 0.34% gc time)
0 件のコメント:
コメントを投稿