2017-10-23 18 views
3

収率を(と収率)as python doするジュリアンの方法は何ですか?julian pythonの収量を(そしてからの収穫)

編集:私は小さな例をpythonに追加しようとします。

4x4チェスボードを考えてください。チェスの王ができるすべてのNの長い道のりを見つける。メモリを浪費しないでください - >すべてのパスのジェネレータを作ります。

我々は数字ですべての位置に署名する場合:

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 16 

点0 3人の隣人(1、4、5)を有します。私たちは、すべてのポイントのために、すべての隣人のためのテーブルを見つけることができる:ポイントのリストから、または(...の発電機)の発電機からのパスを指定した拡大表示

NEIG = [[1, 4, 5], [0, 2, 4, 5, 6], [1, 3, 5, 6, 7], [2, 6, 7], [0, 1, 5, 8, 9], [0, 1, 2, 4, 6, 8, 9, 10], [1, 2, 3, 5, 7, 9, 10, 11], [2, 3, 6, 10, 11], [4, 5, 9, 12, 13], [4, 5, 6, 8, 10, 12, 13, 14], [5, 6, 7, 9, 11, 13, 14, 15], [6, 7, 10, 14, 15], [8, 9, 13], [8, 9, 10, 12, 14], [9, 10, 11, 13, 15], [10, 11, 14]] 

再帰関数(ジェネレータ)はポイント:

def enlarge(path): 
    if isinstance(path, list): 
     for i in NEIG[path[-1]]: 
      if i not in path: 
       yield path[:] + [i] 
    else: 
     for i in path: 
      yield from enlarge(i) 
所定の長さ毎にパスを与える

機能(発電機)

def paths(length): 
    steps = ([i] for i in range(16)) # first steps on every point on board 
    for _ in range(length-1): 
     nsteps = enlarge(steps) 
     steps = nsteps 
    yield from steps 

我々は、長さ10と905776本の経路があることを見ることができる:

sum(1 for i in paths(10)) 
Out[89]: 905776 

ipythonで私達ははtimeitできます

%timeit sum(1 for i in paths(10)) 
1.21 s ± 15.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

マイジュリアの実装は醜いとはるかに複雑です。そしてそれはより遅いようです。

+1

からResumableFunctions.jl

をチェックしてください。今度はチャンネルに向かって変化しています:https://stackoverflow.com/q/44987612/4183191。それを言って、ジュリアにも 'yield'コマンドがあることに注意してください。 –

+1

ありがとう!しかし、@ggggのおかげで、パフォーマンステストが本当に面白いこの[ディスカッション](https://discourse.julialang.org/t/pygen-python-style-generators/3451/54)が見つかりました。 – Liso

答えて

3

は、タスク/プロデュース/消費と一緒に使用README

using ResumableFunctions 

@resumable function fibonnaci(n::Int) :: Int 
    a = 0 
    b = 1 
    for i in 1:n-1 
    @yield a 
    a, b = b, a+b 
    end 
    a 
end 

for fib in fibonnaci(10) 
    println(fib) 
end 
+0

クール! :)しかし、それは[生産品質](https://discourse.julialang.org/t/ann-resumablefunctions/5711/7)ですか? – Liso

+0

"生産準備"の前にタイヤを蹴る人は、たぶん数人必要です。このレスポンスを書いている間、作成するイテレータは 'collect'をサポートしていないことがわかりましたが、PRの修正には約30分しかかかりませんでした。 https://github.com/BenLauwens/ResumableFunctions.jl/pull/6しかし、それは同等のpythonジェネレータよりもずっと速くなければなりません。 – gggg

+0

素晴らしい! :D ResumableFunctionsとPythonのパフォーマンスを比較しましたか、それともあなたの意見ですか? – Liso