Почему модуль должен выполняться во время каждой итерации?
Это один из тех вопросов, где я наткнулся на правильный ответ, но я не понимаю, почему он правильный, и Википедия не помогла. Для Розалинды я написал простой скрипт для получения числа всех возможных последовательностей РНК из белковой нити (по модулю 1 000 000). Я знаю, что это не самый эффективный из возможных кодов (отчасти потому, что я перерабатываю биты из предыдущих вещей, которые я сделал), но вот он:
protein = """<large protein string>"""
protein = ''.join(protein.split('\n'))
translate = {'UUU' : 'F','CUU' : 'L','AUU' : 'I','GUU' : 'V','UUC' : 'F','CUC' : 'L','AUC' : 'I','GUC' : 'V','UUA' : 'L','CUA' : 'L','AUA' : 'I','GUA' : 'V','UUG' : 'L','CUG' : 'L','AUG' : 'M','GUG' : 'V','UCU' : 'S','CCU' : 'P','ACU' : 'T','GCU' : 'A','UCC' : 'S','CCC' : 'P','ACC' : 'T','GCC' : 'A','UCA' : 'S','CCA' : 'P','ACA' : 'T','GCA' : 'A','UCG' : 'S','CCG' : 'P','ACG' : 'T','GCG' : 'A','UAU' : 'Y','CAU' : 'H','AAU' : 'N','GAU' : 'D','UAC' : 'Y','CAC' : 'H','AAC' : 'N','GAC' : 'D','UAA' : 'Stop','CAA' : 'Q','AAA' : 'K','GAA' : 'E','UAG' : 'Stop','CAG' : 'Q','AAG' : 'K','GAG' : 'E','UGU' : 'C','CGU' : 'R','AGU' : 'S','GGU' : 'G','UGC' : 'C','CGC' : 'R','AGC' : 'S',
'GGC' : 'G','UGA' : 'Stop','CGA' : 'R','AGA' : 'R','GGA' : 'G','UGG' : 'W','CGG' : 'R','AGG' : 'R','GGG' : 'G',
}
aminos = translate.values()
sample = [l for l in protein] + ['Stop']
score = []
for s in sample:
c = aminos.count(s)
score.append(c)
import math
result = reduce(lambda x, y: x*y, score) % 1000000
print result
Это вычисляет общее количество последовательностей РНК и принимает модуль по окончательному результату (или я так думаю). Я получил неправильный ответ дважды, прежде чем решил попробовать это:
import math
result = reduce(lambda x, y: x*y % 1000000, score)
print result
Это, по-видимому, привело к правильному ответу. Почему по модулю нужно выполнять каждый х * у? Я не понимаю по модулю или я не понимаю Python?
РЕДАКТИРОВАТЬ: Извините, опечатка.
1 ответ
Разница между
reduce(lambda x, y: x*y, score) % 1000000
а также
reduce(lambda x, y: x*y % 1000000, score)
Это первый должен работать с long
s до произведения всех значений в score
в то время как второй будет работать со значениями не больше, чем max(score) * 999999
,
Произвольно большие целые числа не могут быть сохранены в конечной памяти, равно как и их произведение не может быть рассчитано за постоянное время, так что вы с большей вероятностью попадете в OutOfMemoryError
или очень долго с первым вариантом