1'den 30'a kadar uzunluktaki DNA dizgilerinde ters tümleme işlevi çağrılmasını gerektiren bir python betiği yazıyorum. Satır profili oluşturma programları, işlevlerimin ters tümleyicileri elde etmek için çok zaman harcadığını gösteriyor, bu yüzden bakıyorum optimize etmek için.
Python'da bir dizinin ters tümlemesini elde etmenin en hızlı yolu nedir? Örnek olarak, DNA dizisi boyutu 17 olan farklı uygulamaları test etmek için iskelet programımı gönderiyorum.
#! / Usr / bin / env pythonimport randomimport timeitglobal completecomplement = {'A': 'T ',' C ':' G ',' G ':' C ',' T ':' A '} DNAlength = 17 # rasgele 100k basesint_to_basemap = {1:' A ', 2:' C ', 3 oluştur 'G', 4: 'T'} num_strings = 500000random.seed (90210) DNAstrings = ["" .join ([int_to_basemap [random.randint (1,4)] aralıktaki i için (DNAlength)]) range (num_strings)] # DNAstringlerinin neye benzediğine dair bir fikir edinin (DNAstrings [0: 5]) def reverse_complement_naive (seq): this_complement = {'A': 'T', 'C': 'G', 'G ':' C ',' T ':' A '} return "" .join (this_complement.get (base, base) for base in reversed (seq)) def reverse_complement (seq): return "" .join (tamamlayıcı. ters çevrilmiş (seq) baz için get (taban, taban) tic = timeit.default_timer () rcs = [DNA dizelerinde sıra için ters_complement_naive (seq)] toc = timeit.default_timer () baseline = toc - ticnamefunc = {"naif uygulama ation ": reverse_complement_naive," global dikte uygulaması ": isim işlevindeki işlev_adı için ters_ tamamlayıcı}: func = adefunc [işlev_adı] tic = timeit.default_timer () rcs = [DNA dizilerindeki sıra için işlev (seq)] toc = timeit.default_timer () walltime = toc-tic print ("" "{} {: .5f} toplam, saniyede {: .1f} dize {: .1f} taban çizgisine göre% artış" "". format (işlev_adı, duvar saati, sayı_dizeleri / duvar saati , 100- ((walltime / baseline) * 100)))
Bu arada, bunun gibi çıktılar alıyorum. Elbette aramaya göre değişir!
naif uygulama 1,83880sn toplam, 271916,7 dize / saniye - toplamda 1,74645s taban çizgisi uygulamasına göre% 0,7 artış, saniyede 286294,3 dize taban değerine göre% 4,3 artış
Düzenle: Harika cevaplar millet! Bir veya iki gün içinde bir şansım olduğunda, bunların hepsini son çalıştırma için bir test dosyasına ekleyeceğim. Soruyu sorduğumda, son cevabı seçerken cython veya c uzantılarına izin verip vermeyeceğimi düşünmemiştim. Hepiniz ne düşünüyorsunuz?
Düzenleme 2: İşte herkesin uygulamalarını içeren son simülasyonun sonuçları. Cython / C içermeyen en yüksek puanlı saf python kodunu kabul edeceğim. Kendi iyiliğim için user172818'in c uygulamasını kullandım. Gelecekte buna katkıda bulunmayı düşünüyorsanız, bu soru için yaptığım github sayfasına bakın.
ters tamamlama uygulamalarının çalışma zamanı. 10000 dize ve 250 tekrarlar╔════════════════════════════════════════════════ ══════╗║ ad% inc s s başına toplam str ║╠════════════════════════════════ ══════════════════════╣║ user172818 seqpy.c 93.7% 0.002344 4266961.4 ║║ alexreynolds Cython (v2) 93.4% 0.002468 4051583.1 ║║ alexreynolds Cython (v1) 90.4% 0.003596 2780512.1 ║║ devonryan string 86.1% 0.005204 1921515.6 ║║ jackaidley bytes 84.7% 0.005716 1749622.2 ║║ jackaidley bytesstring 83.0% 0.006352 1574240.6 ║║ global dict 5.4% 0.035330 283046.7 ║║ revcomp.9% 0.02_translate204rep836 45.9% 0.02452 4999 ║║ SO'dan revcom 28,0% 0,026904 371694,5 ║║ naif (başlangıç) 1,5% 0,036804 271711,5 ║║ lambd a SO'dan -39.9% 0.052246 191401.3 ║║ biopython seq sonra rc -32.0% 0.049293 202869.7 ║╚═════════════════════════════ ═════════════════════════╝