22

短い文字列、つまり「kmer」に一致する可能性のあるすべてのファジー文字列一致を計算するスクリプトを作成しようとしています。Python 2.7.X で動作する同じコードは、Python 3.3 で非決定論的な答えを返します。 .X で、その理由がわかりません。

コード内でディクショナリ、itertools.product、および itertools.combinations を反復処理しますが、それらすべてを中断または継続なしで完了するまで反復処理します。さらに、すべての結果を反復処理中の辞書ではなく、別の辞書に保存します。要するに、私は明らかな間違いを犯していないのに、Python2 と Python3 で動作が異なるのはなぜですか?

以下のサンプル、わずかに簡略化されたコード:

import itertools

def find_best_fuzzy_kmer( kmers ):
    for kmer, value in kmers.items():
        for similar_kmer in permute_string( kmer, m ):
            # Tabulate Kmer

def permute_string( query, m ):
    query_list = list(query)
    output = set() # hold output
    for i in range(m+1):
        # pre-calculate the possible combinations of new bases
        base_combinations = list(itertools.product('AGCT', repeat=i))
        # for each combination `idx` in idxs, replace str[idx]
        for positions in itertools.combinations(range(len(query_list)), i):
            for bases in base_combinations:
                # Generate Permutations and add to output
    return output
4

1 に答える 1

35

「非決定論的」とは、(辞書を反復処理するときに) 辞書キーが表示される順序が実行ごとに変化し、辞書キーが文字列であることを意味する場合は、そう言ってくださいそれから私は助けることができます。しかし、今のところあなたはそれについて何も言っていません ;-)

それが問題であると仮定すると、ここに小さなプログラムがあります:

d = dict((L, i) for i, L in enumerate('abcd'))
print(d)

4 からの出力は Python 3.3.2 で実行されます。

{'d': 3, 'a': 0, 'c': 2, 'b': 1}
{'d': 3, 'b': 1, 'c': 2, 'a': 0}
{'d': 3, 'a': 0, 'b': 1, 'c': 2}
{'a': 0, 'b': 1, 'c': 2, 'd': 3}

python -h原因は、出力のこの部分から示唆されています。

Other environment variables:
...
PYTHONHASHSEED: if this variable is set to 'random', a random value is used
   to seed the hashes of str, bytes and datetime objects.  It can also be
   set to an integer in the range [0,4294967295] to get hash values with a
   predictable seed.

これは中途半端な「セキュリティ修正」であり、二次時間動作を誘発するように設計された辞書入力の構築に基づいて DOS 攻撃を防ぐことを目的としています。「ランダム」は Python3 のデフォルトです。

envar PYTHONHASHSEED を整数に設定することで、これを無効にすることができます (気にしない場合は 0 を選択してください)。次に、文字列キーで辞書を反復すると、実行全体で同じ順序でそれらが生成されます。

@AlcariTheMad がコメントで述べたように、Python 2 で Python3 のデフォルトの動作を有効python -R ...にすることができます。

于 2013-11-09T04:16:46.893 に答える