#※すみません、質問内容に記載したコードの変数等が意味をなしていないので変更しました。あと、さらなる問題が発覚したので追記しました。
###時間のかかる以下のコードを改善したいです↓
python3
1 2import more_itertools 3 4amino_acid = 'L'*4 + 'A'*4 + '-'*13 5gen = more_itertools.distinct_permutations(amino_acid) 6all_patarn = list(gen) 7 8patarn_list = [] 9 10for each_patarn in all_patarn: 11 string_aminoacid = "" 12 for each_patarn_word in each_patarn: 13 string_aminoacid += each_patarn_word 14 print(string_aminoacid) 15 patarn_list.append(string_aminoacid) 16 string_aminoacid = ""
これで14,244,300通りの計算をしたことになるのですが、かなり時間がかかってしまいます。(5~6分前後)
もっと、高速化するためにforを2回繰り返しているところを改善したいのですが、どのようにすると良いでしょうか?
ご教授ください。
さらにここから、以下のコードに完成したデータを代入する予定です。
amino_acidは21個の文字列でできているため、14,244,300*21通りの処理をすることとなり、かなり遅くなってしまうことが確実です。
Python3
1import more_itertools 2 3amino_acid = 'L'*4 + 'A'*4 + '-'*13 4gen = more_itertools.distinct_permutations(amino_acid) 5all_patarn = list(gen) 6 7patarn_list = [] 8 9for each_patarn in all_patarn: 10 string_aminoacid = "" 11 for each_patarn_word in each_patarn: 12 string_aminoacid += each_patarn_word 13 # print(string_aminoacid) 14 patarn_list.append(string_aminoacid) 15 string_aminoacid = "" 16 17↑上記コードと同様 18------------------------------------------- 19↓上記の結果を利用するコード 20 21seq_num_1 = len(patarn_list[0]) 22seq_num = len(patarn_list) 23seq_list = [] 24for create_seq in range (0,seq_num_1): 25 seq_unit = "" 26 for create_seq_1 in range (0,seq_num): 27 seq = patarn_list[create_seq_1][create_seq] 28 seq_unit += seq 29 seq_list.append(seq_unit) 30 seq_unit = "" 31print(seq_list)
そのコードはなにをしようとしてるんでしょうか。
♦︎コードの上側で実施していること
上のコードで、「L」を4文字、「A」を4文字、「-」を13文字含む文字列について、その並び方を全て生成しています。
ゆえに、21C4*17C4通りの並べ方が存在するため、約1400万通りの文字列が生成されています。
※ここでの「C」はcombination計算をすることを意味しています。
♦︎「-」で区切った下側で実施していること
さらに、追記したコードでは、それぞれの並べ方に対して、先頭の1文字目から最後の文字までを縦に一列ずつ取得するためのコードです。文字列は21文字に設定しているため、1400万*21通りの処理を行うことになります。
1400万通りだけで5分程度待たないといけないので、その数に21をかけた処理を行うのにどれだけの時間がかかるのか、想像しただけで寒気がするので質問させていただきました。
後半のコードが column_list 等が定義されていない (質問のコードに含まれていない) ためエラーとなります。
すみませんでした。column_listを修正しました。
素朴な疑問なのですがこのデータって転置する意味があるのでしょうか?
転置した場合
21!/4!/4!/13! = 14244300
どこの列を切り出しても
L=2713200 4/21
A=2713200 4/21
-=8817900 13/21
ソートされているわけでもないし組み合わせの意味がないような気がするのですが
同じものを含む順列でしたらリストひとつずつ枝刈していけば計算量を減らすことはできます。
♦︎簡潔に説明すると以下です。
「このデータを作成する意味は、データからアミノ酸の保存度を算出する際に、答えあわせ用に存在するサイトで算出される値と自分のプログラムに同じデータを通した時の値を比較、検討することです。
そして、転置しないと、自分のプログラムと比較する答えあわせ用のサイトに通らない」
からです。
つまり、データとして適しているものを作成。そのあとに、そのデータを答えあわせするサイトに通すために転置するという手順を取っています。
これ以上、目的や何をしているのか?を説明するとなると、実際にアミノ酸保存度に関する論文を読んでいただく方が早いかと思います。
ご説明どうもありがとうございます。
確認のため必要なのですね。すっきりしました。
回答2件
あなたの回答
tips
プレビュー