収率を(と収率)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)
マイジュリアの実装は醜いとはるかに複雑です。そしてそれはより遅いようです。
からResumableFunctions.jl
をチェックしてください。今度はチャンネルに向かって変化しています:https://stackoverflow.com/q/44987612/4183191。それを言って、ジュリアにも 'yield'コマンドがあることに注意してください。 –
ありがとう!しかし、@ggggのおかげで、パフォーマンステストが本当に面白いこの[ディスカッション](https://discourse.julialang.org/t/pygen-python-style-generators/3451/54)が見つかりました。 – Liso