2016-04-18 16 views
5

私はjuliaで単純なone-linerを書いて少しの問題を解決しました:2桁の数字Aと3桁の数字Bを見つけて、 、X Bは、5桁の数字であり、0から9までのすべての数字が数Aのうち一度だけ表示され、B及びA X、Bは、例えば、julia one-linerをPythonと同じように最適化する

54 x 297 = 16,038 

ここで、すべての可能な発見私のジュリア・コードであります解決策:

println(filter(l -> length(unique(reduce(vcat, (map(digits, l))))) == 10, [[x, y, x*y] for x in Range(10:99), y in Range(100:999)])) 

これは問題を解決しますが、私はPythonで試して、これを思いついた:

print filter(lambda y: len(set(''.join([str(x) for x in y])))==10, [[x, y, x*y] for x in range(10, 99) for y in range(100, 999)]) 

タイミングを合わせると、私はPythonコードがjuliaコードの2倍以上の速さで実行されていることに驚きました。ジュリアコードの高速化のための提案(1ライナーにすることを推奨します)?別に

:私はrange(12, 98)range(102, 987)までの範囲の迅速な微調整との両方を向上させることができます知っています。ワンライナーを超えて移動する

更新

は、私が速くリストよりできるループアドバイスを撮影したので、私は次の選択肢と比較:

ans = Array{Tuple{Int32, Int32, Int32}}(0) 
for x in 12:98 
    for y in 102:987 
    if length(unique(digits(x+y*100+x*y*100_000)))==10 push!(ans, (x, y, x*y) end 
    end 
end 
println(ans) 
ジュリア

Python

ans = [] 
for x in range(12,98): 
    for y in range(102,987): 
    if len(set(str(x+y*100+x*y*100000)))==10: 
     ans.append((x, y, x*y)) 
print ans 

Pythonコードは(たとえ私が両方のコードを単純にリストに集めるのではなくループ内に出力するように変更したとしても)はるかに高速です。私はジュリアからのより良いパフォーマンスを期待していた。

はまた、あなたが興味を持っている場合には、ソリューションの完全なリストは、このコードは元の1のおよそ3倍の速度である私のコンピュータで

39 x 402 = 15,678 
27 x 594 = 16,038 
54 x 297 = 16,038 
36 x 495 = 17,820 
45 x 396 = 17,820 
52 x 367 = 19,084 
78 x 345 = 26,910 
46 x 715 = 32,890 
63 x 927 = 58,401 
+0

私はこれらをコマンドラインで 'time'と計時していました。 Pythonのjuliaと 'timeit'に' @time'を使うと、Pythonコードは倍以上ではなく約65%高速ですが、それでも重要な違いがあります。 – seancarmody

+4

'(x、y、x * y)'を '[x、y、x * y]'に置き換えると、30%の改善が得られます。 'Range(10:99)'を '10:99'に置き換えてコードを短縮することもできます。 –

+0

ありがとうございます。興味深いことに、リストではなくタプルに変更すると、ジュリアの大幅な改善が得られますが、Pythonではごくわずかです。 – seancarmody

答えて

5

@simd for x in 10:99 for y in 100:999 length(unique(digits(x+y*100+x*y*100_000)))==10 && println(x,'*',y,'=',x*y) end end

です。 (0.223902秒対0.680781秒)

キーは"avoid unnecessary arrays"になります。可能であればforループまたはタプルを使用する

+0

良い解決策、私は1つの質問があります...この例で@simdの目的は何ですか?そして、それをいつ使用するのかあなたはどのように知っていますか? – Esteban

+0

@Estebanそれは[julia doc](http://docs.julialang.org/en/release-0.4/manual/performance-tips/#performance-annotations)からですが、正直言ってこの例ではほとんど改善されていません –

+0

提案に感謝します。興味深いことに、Pythonコードを同様の配列ではなくループを使用するように変更したところ、結果はjuliaコードよりもはるかに高速でした。確かに、空白の書式設定の要件は、Pythonコードが1行ではなく4行であることを意味します。 – seancarmody

関連する問題