ある画像処理用のアルゴリズムのPythonによる実装です。目的の数列は得られるのですが、リストを使っているためにメモリ効率が悪いです。Pythonにはジェネレータがあることを知り、リストを使わずyieldを使ってスマートにメモリ効率の良いコードが書けるのではないかと思ったのですが、Pythonを学んで日が浅く、わからずにいます。
Python
1import sys 2 3 4def create(depth, left, right): 5 if left > right: 6 return None 7 else: 8 return bin_node(depth + 1, left, right) 9 10 11def bin_node(depth, left, right): 12 center = (left + right) // 2 13 return { 14 'depth': depth, 15 'center': center, 16 'leftNode': create(depth, left, center - 1), 17 'rightNode': create(depth, center + 1, right) 18 } 19 20 21def get_max_depth(node): 22 if node is None: 23 return 0 24 else: 25 return max([node['depth'], get_max_depth(node['leftNode']), get_max_depth(node['rightNode'])]) 26 27 28def traverse_in_depth(node, depth): 29 list = [] 30 if node is not None and node['depth'] == depth: 31 list.append(node['center']) 32 elif node is not None and node['depth'] < depth: 33 list.extend(traverse_in_depth(node['leftNode'], depth)) 34 list.extend(traverse_in_depth(node['rightNode'], depth)) 35 return list 36 37 38def bin_node_iterator(left, right): 39 root_node = create(0, left, right) 40 41 max_depth = get_max_depth(root_node) 42 43 list = [] 44 for depth in range(1, max_depth + 1): 45 list.extend(traverse_in_depth(root_node, depth)) 46 47 return list 48 49 50left = int(sys.argv[1]) 51right = int(sys.argv[2]) 52print(left, right) 53for n in bin_node_iterator(left, right): 54 print(n, end=" ")
試したこと
(traverse_in_depth関数、bin_node_iterator関数以外は同じ)
Python
1def traverse_in_depth(node, depth): 2 if node is not None and node['depth'] == depth: 3 yield node['center'] 4 elif node is not None and node['depth'] < depth: 5 yield traverse_in_depth(node['leftNode'], depth) 6 yield traverse_in_depth(node['rightNode'], depth) 7 8 9def bin_node_iterator(left, right): 10 root_node = create(0, left, right) 11 12 max_depth = get_max_depth(root_node) 13 14 for depth in range(1, max_depth + 1): 15 yield traverse_in_depth(root_node, depth)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/20 06:36
2019/10/20 06:45
2019/10/20 06:52
2019/10/20 07:05