比較的単純な質問:
CPU バウンドのボトルネック メソッドを Python から C 拡張 (ほぼ同じアルゴリズムを実装) に変換すると、
- 速度とパフォーマンスの向上はどの程度期待できますか?
- それを決定する要因は何ですか?
更新: 人々は詳細の欠如に不満を持っているようでした. 私は主に、どのような要因が Python コードの一部を C で書き直すのに適した候補にするのかを理解しようとしていました (つまり、元の Python が CPU バウンドである場合、C に移植すると実際に速度が向上するのはいつでしょうか)。
詳細については、これが私が見ているコードです。基本的には、リストの 2 つのリスト (「列」のリスト、各列にはその列に入る可能性のある値が含まれています...基本的にはスキーマ) を取り、n 未満にすることが可能かどうかを確認する再帰的な方法です。 (通常は 1) 変更 (列に新しい値を追加する、新しい列を追加する、列を削除するなどの変更が行われる場合) 値のシーケンス (各列から 1 つの値) が存在するようにします。どちらのスキーマからでも構築できます。これは、文字列間の編集距離を計算するのと非常によく似ています。コードは次のとおりです。
def CheckMerge(self, schemai, schemaj, starti, startj, \
changesLeft, path):
# if starti == 0 and startj == 0:
# print '\n'
# print schemai.schema
# print ''
# print schemaj.schema
if starti == len(schemai.schema) and startj == len(schemaj.schema):
return (True, path)
if starti < len(schemai.schema):
icopy = schemai.schema[starti]
else:
icopy = []
if startj < len(schemaj.schema):
jcopy = schemaj.schema[startj]
else:
jcopy = []
intersect = set(icopy).intersection(set(jcopy))
intersect.discard('')
if len(intersect) == 0:
if starti < len(schemai.schema) and \
('' in schemai.schema[starti] or changesLeft > 0):
if not '' in schemai.schema[starti]:
changesLeft -= 1
changesCopy = list(path)
changesCopy.append('skipi')
result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj, \
changesLeft, changesCopy)
if result:
return (result,steps)
elif not '' in schemai.schema[starti]:
changesLeft += 1
if startj < len(schemaj.schema) and \
('' in schemaj.schema[startj] or changesLeft > 0):
if not '' in schemaj.schema[startj]:
changesLeft -= 1
changesCopy = list(path)
changesCopy.append('skipj')
result,steps = self.CheckMerge(schemai, schemaj, starti, startj+1, \
changesLeft, changesCopy)
if result:
return (result, steps)
elif not '' in schemaj.schema[startj]:
changesLeft += 1
if changesLeft > 0:
changesCopy = list(path)
changesCopy.append('replace')
changesLeft -= 1
result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj+1, \
changesLeft, changesCopy)
if result:
return (result, steps)
return (False, None)
else:
changesCopy = list(path)
changesCopy.append('merge')
result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj+1, \
changesLeft, changesCopy)
if result:
return (result, steps)
else:
return (False, None)