5

この Julia 式で配列を作成しないようにする方法はありますか:

max((filter(n -> string(n) == reverse(string(n)), [x*y for x = 1:N, y = 1:N])))

そして、この Python ジェネレータ式と同様に動作するようにします。

max(x*y for x in range(N+1) for y in range(x, N+1) if str(x*y) == str(x*y)[::-1])

Julia バージョンは、Python の N*N/2 に対して、配列の割り当てと N*N 回の反復により、Python よりも 2.3 倍遅くなります。

編集

Julia でいくつかの実装を試した後、私が入手した最速のループ スタイル バージョンは次のとおりです。

function f(N)   # 320ms for N=1000  Julia 0.2.0 i686-w64-mingw32
    nMax = NaN
    for x = 1:N, y = x:N
        n = x*y 
        s = string(n)
        s == reverse(s) || continue
        nMax < n && (nMax = n)
    end 
    nMax
end 

しかし、改善された機能バージョンはそれほど遅れていません (2 倍のドメインを考慮した場合、わずか 14% 遅くなるか、大幅に速くなります):

function e(N)   # 366ms for N=1000  Julia 0.2.0 i686-w64-mingw32
    isPalindrome(n) = string(n) == reverse(string(n))
    max(filter(isPalindrome, [x*y for x = 1:N, y = 1:N]))
end 

isPalindromeこのページの上部にあるオリジナル バージョンと比較して、関数を定義することにより、2.6 倍の予期しないパフォーマンスの向上があります。

4

4 に答える 4

2

私はそうは思わない。現在、Julia 配列内包表記にはフィルターがありません。この号の議論を参照してください。

この特定のケースでは、for計算を高速化したい場合は、ネストされたループのみをお勧めします。

(最初から逆算し、成功したものを見つけるとすぐに停止する、より高速なアプローチがあるかもしれませんN。それを正しく行う方法を理解することは、演習として残されています...)

于 2013-07-07T21:23:03.460 に答える