Hi!
Ich habe eine funktion geschrieben, die eine MessengerRNA (mRNA) in eine Peptid-Kette übersetzt.
Die funktion soll dabei berücksichtigen, das jeder 3er schritt nach dem start triplet AUG manuel ausgwertet wird, sprich das noch keine vorhandene zeichenfolge verglichen wird wie "AGG => Pro" sondern das diese Individual zusammengesetzt werden.
Dabei will ich natürlich möglichst schnell sein, was bedeutet das jede milisekunde zählt.
Da mir mittlerweile nichtsmehr einfällt, was ich noch verbessern könnte, damit es schneller wird wollte ich einmal fragen, ob ihr noch ideen habt wie ich das ganze schneller machen könnte.
Was weshalb wie ist:
1. while() anstatt for(), wurde mit beidem getestet und while ist im test schneller gewesen, obwohl grundsetzlich die selben operationen durchgeführt werden.
$mrna{0},{1}.., da dies schneller ist als immer $chr = $mrna{x} vorher zuzuweisen, der direktzugriff auf einen teil des strings scheint also schneller zu sein als das zuweisen des teilstrings zum vergleichen.
if/else anstatt switch/case, ebenfalls schneller.
Hier mal mein code:
Zum testen habe ich folgendes gemacht:
Braucht bei mir mit Athlon 1700+ und PHP 4.3 im moment 22 sekunden.
Wenn ihr irgendwelche vorschläge habt wie ich es noch schneller machen kann, dann bitte her damit! Danke..
Ich habe eine funktion geschrieben, die eine MessengerRNA (mRNA) in eine Peptid-Kette übersetzt.
Die funktion soll dabei berücksichtigen, das jeder 3er schritt nach dem start triplet AUG manuel ausgwertet wird, sprich das noch keine vorhandene zeichenfolge verglichen wird wie "AGG => Pro" sondern das diese Individual zusammengesetzt werden.
Dabei will ich natürlich möglichst schnell sein, was bedeutet das jede milisekunde zählt.
Da mir mittlerweile nichtsmehr einfällt, was ich noch verbessern könnte, damit es schneller wird wollte ich einmal fragen, ob ihr noch ideen habt wie ich das ganze schneller machen könnte.
Was weshalb wie ist:
1. while() anstatt for(), wurde mit beidem getestet und while ist im test schneller gewesen, obwohl grundsetzlich die selben operationen durchgeführt werden.
$mrna{0},{1}.., da dies schneller ist als immer $chr = $mrna{x} vorher zuzuweisen, der direktzugriff auf einen teil des strings scheint also schneller zu sein als das zuweisen des teilstrings zum vergleichen.
if/else anstatt switch/case, ebenfalls schneller.
Hier mal mein code:
PHP:
<?php
function mrna_to_pepchain1($mrna)
{
//Find the start-codon and fetch the tail..
$mrna = strstr($mrna, 'AUG');
$max = floor(strlen($mrna)/3)-1;
$chain = '';
$i = -1;
while($i<$max)
{
$i++;
$mrna = substr($mrna, 3);
if($mrna{0} == 'G')
{
if($mrna{1} == 'G')
{
$chain .= 'Gly-';
}
elseif($mrna{1} == 'A')
{
if($mrna{2} == 'G' || $mrna{2} == 'A')
{
$chain .= 'Glu-';
}
else
{
$chain .= 'Asp-';
}
}
elseif($mrna{1} == 'U')
{
$chain .= 'Val-';
}
else
{
$chain .= 'Ala-';
}
}
elseif($mrna{0} == 'A')
{
if($mrna{1} == 'G')
{
if($mrna{2} == 'G' || $mrna{2} == 'A')
{
$chain .= 'Arg-';
}
else
{
$chain .= 'Ser-';
}
}
elseif($mrna{1} == 'A')
{
if($mrna{2} == 'G' || $mrna{2} == 'A')
{
$chain .= 'Lys-';
}
else
{
$chain .= 'Asn-';
}
}
elseif($mrna{1} == 'U')
{
if($mrna{2} == 'G')
{
$chain .= 'Met-';
}
else
{
$chain .= 'Ile-';
}
}
else
{
$chain .= 'Thr-';
}
}
elseif($mrna{0} == 'U')
{
if($mrna{1} == 'G')
{
if($mrna{2} == 'G')
{
$chain .= 'Trp-';
}
elseif($mrna{2} == 'A')
{
break;
}
else
{
$chain .= 'Cys-';
}
}
elseif($mrna{1} == 'A')
{
if($mrna{2} == 'G' || $mrna{2} == 'A')
{
break;
}
else
{
$chain .= 'Tyr-';
}
}
elseif($mrna{1} == 'U')
{
if($mrna{2} == 'G' || $mrna{2} == 'A')
{
$chain .= 'Leu-';
}
else
{
$chain .= 'Phe-';
}
}
else
{
$chain .= 'Ser-';
}
}
else
{
if($mrna{1} == 'G')
{
$chain .= 'Arg-';
}
elseif($mrna{1} == 'A')
{
if($mrna{2} == 'G' || $mrna{2} == 'A')
{
$chain .= 'Gln-';
}
else
{
$chain .= 'His-';
}
}
elseif($mrna{1} == 'U')
{
$chain .= 'Leu-';
}
else
{
$chain .= 'Pro-';
}
}
}
return substr($chain, 0, -1);
}
?>
Zum testen habe ich folgendes gemacht:
PHP:
<?php
$test_mrna =
'GACUAUGAAAACACAGUCUGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACU
CAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUAGUACUCAAGGUACUAUAUGGAUUGC
AGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCC
UUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAG
CUACGGGAAUCAAUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCA
GCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCC
UCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUA
GUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCC
CCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAUAUA
UGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGC
UCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAUCAAUCCCCCCCUUACGGCUACAGGUACUCA
AGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAU
GGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGG
AUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUAGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAC
GGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUA
CUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAUCAAUC
CCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACG
GCUACAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUAGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCC
CUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUAC
AGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACUUAGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCC
CUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUAC
AGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAU
CAAUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCC
UUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUCCCCCCCUU
ACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUAGUACUCAAGG
UACUAUAUGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGA
UUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAUAUAUGGAUUGCAG
CUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUU
ACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAUCAAUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUA
UGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGC
UCCCCCCCUUACGAGGAUCGAUUCGAUCCCUCCCCCCCUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUC
CCCCCCUUAGGAUUGCAGCUCCCCCCCUUAGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGGCUACAGGU
ACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAAGGUAC
UAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAUCAAUCCCCCCCUUAC
GGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAUUGC
AGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUAGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGGCUA
CAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUACAGGUACUCAA
GGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAUCAAUCCCCCC
CUUACGGCUACAGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUAGGAUUGCAGCUCCCCCCCUUACGGCUAC
AGGUACUCAAGGUACUAUAUGGAUUGCAGCUCCCCCCCUUACGAGGAUCGAUUCGAUCCCUACGACGAAGCUACGGGAAU
CAAUCAAAUCGGGUUCUUACGGGAAUCAAUCAAAUCGGGUCGAUCCACGA';
$test_mrna = str_replace(array("\r","\n"), '', $test_mrna);
echo '----- BioTranscription::mrna_to_pepchain_1 -----'."\n";
echo 'Start: '.$start=mktime()."\n";
for($i=0;$i<10000;$i++)
{
$chain = mrna_to_pepchain1($test_mrna)."\n"; //mRNA, from 5' to 3'
}
echo $chain;
echo 'Finish: '.$finish=mktime()."\n";
echo 'Result: '.$result=$finish-$start." sekunden\n";
?>
Wenn ihr irgendwelche vorschläge habt wie ich es noch schneller machen kann, dann bitte her damit! Danke..
Zuletzt bearbeitet: