161 Views

Ada jutaan alasan untuk menyukai Python (terutama untuk data scientist). Tetapi bagaimana Python berbeda dari bahasa pemrograman tingkat rendah yang lebih profesional seperti C atau C ++? Saya kira ini adalah pertanyaan yang banyak data scientist atau pengguna Python tanyakan atau tanyakan pada diri mereka sendiri suatu hari nanti. Ada banyak perbedaan antara Python dan bahasa seperti C ++. Untuk artikel ini, saya akan menunjukkan kepada kalian seberapa cepat C ++ dibandingkan dengan Python dengan contoh yang sangat sederhana.

Untuk menunjukkan perbedaannya yaitu saya menggunakan kasus permutasi DNA yang melibatkan proses looping. Permutasi DNA untuk menghasilkan semua kemungkinan k-mers DNA untuk nilai tetap “k”. Saya memilih contoh ini karena banyak tugas pemrosesan dan analisis data terkait genomik (misalnya, generasi k-mers) dianggap intensif secara komputasi. Itulah alasan mengapa banyak data scientist di bidang bioinformatika tertarik dengan C ++ (selain Python).

CATATAN PENTING: Tujuan artikel ini bukan untuk membandingkan C ++ dan Python dengan cara yang paling efisien. Kedua kode tersebut dapat ditulis dengan cara yang lebih efisien dan menggunakan pendekatan yang jauh lebih baik. Satu-satunya tujuan artikel ini adalah untuk membandingkan kedua bahasa ini ketika mereka menggunakan algoritma dan instruksi yang persis sama, agar lebih adil. Bukan untuk menulis kode secara efisien.

Pengantar Singkat tentang DNA K-mers

DNA adalah rantai panjang unit yang disebut nukleotida. Dalam DNA, terdapat 4 jenis nukleotida yang ditunjukkan dengan huruf A, C, G, dan T. Manusia (atau lebih tepatnya Homo Sapiens) memiliki 3 miliar pasangan nukleotida. Misalnya, sebagian kecil dari DNA manusia dapat berupa:

ACTAGGGATCATGAAGATAATGTTGGTGTTTGTATGGTTTTCAGACAATT

Dalam contoh ini, jika kita memilih 4 nukleotida berurutan (yaitu huruf) dari string ini, itu akan menjadi k-mer dengan panjang 4 (Saya menyebutnya 4-mer). Berikut adalah beberapa contoh 4-m yang diturunkan dari contoh tersebut.

  • ACTA,
  • CTAG,
  • TAGG,
  • AGGG,
  • GGGA

Tantangan Permutasi

Untuk artikel ini, mari kita buat semua 13-m yang mungkin. Secara matematis ini adalah permutasi dengan masalah pengganti. Oleh karena itu, kita memiliki 4¹³ (= 67.108.864) kemungkinan 13-m. Saya menggunakan algoritma sederhana untuk menghasilkan hasil dalam C ++ dan Python. Mari kita lihat solusinya dan membandingkannya.

Membandingkan Solusi

Untuk membandingkan C ++ dan Python untuk tantangan khusus ini dengan mudah, saya menggunakan algoritma yang persis sama untuk kedua bahasa. Kedua kode tersebut sengaja dirancang agar sederhana dan serupa. Saya menghindari penggunaan struktur data yang kompleks atau paket atau pustaka pihak ketiga. Kode pertama ditulis dengan Python.

def tic():
    #Homemade version of matlab tic and toc functions
    import time
    global startTime_for_tictoc
    startTime_for_tictoc = time.time()

def toc():
    import time
    if 'startTime_for_tictoc' in globals():
        print ("Elapsed time is " + str(time.time() - startTime_for_tictoc) + " seconds.")
    else:
        print ("Toc: start time not set")
        
def convert(c):
    if (c == 'A'): return 'C'
    if (c == 'C'): return 'G'
    if (c == 'G'): return 'T'
    if (c == 'T'): return 'A'

tic()

print("Start")

opt = "ACGT"
s = ""
s_last = ""
len_str = 13

for i in range(len_str):
    s += opt[0]

for i in range(len_str):
    s_last += opt[-1]

pos = 0
counter = 1
while (s != s_last):
    counter += 1
    # You can uncomment the next line to see all k-mers.
    # print(s)
    change_next = True
    for i in range(len_str):
        if (change_next):
            if (s[i] == opt[-1]):
                s = s[:i] + convert(s[i]) + s[i+1:]
                change_next = True
            else:
                s = s[:i] + convert(s[i]) + s[i+1:]
                break

# You can uncomment the next line to see all k-mers.
# print(s)
print("Number of generated k-mers: {}".format(counter))
print("Finish!")

toc()

Jika Anda menjalankan kode Python, diperlukan waktu Elapsed time is 215.69 seconds untuk menghasilkan 67 juta 13-mers. Untuk mendapatkan perbandingan yang adil, saya mengomentari baris yang menampilkan k-mers (baris 25 dan 37). Jika kalian ingin menampilkan k-mers saat sedang dibuat, kalian dapat menghapus tanda komentar pada dua baris tersebut. Catatan: butuh waktu lama untuk menampilkan semuanya. Silakan gunakan CTRL + C untuk membatalkan kode jika kalian membutuhkannya.

Sekarang, mari kita lihat algoritme yang sama di C ++.

#include <iostream>
#include <string>
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */
#include <math.h>       /* sqrt */

using namespace std;



char convert(char c)
{
    if (c == 'A') return 'C';
    if (c == 'C') return 'G';
    if (c == 'G') return 'T';
    if (c == 'T') return 'A';
    return ' ';
}

int main()
{
    cout << "Start" << endl;
    clock_t t;
    t = clock();


    string opt = "ACGT";
    string s = "";
    string s_last = "";
    int len_str = 13;
    bool change_next;

    for (int i = 0; i < len_str; i++)
    {
        s += opt[0];
    }

    for (int i = 0; i < len_str; i++)
    {
        s_last += opt.back();
    }

    int pos = 0;
    int counter = 1;
    while (s != s_last)
    {
        counter++;
        // You can uncomment the next line to see all k-mers.
        // cout << s << endl;  
        change_next = true;
        for (int i = 0; i < len_str; i++)
        {
            if (change_next)
            {
                if (s[i] == opt.back())
                {
                    s[i] = convert(s[i]);
                    change_next = true;
                }
                else {
                    s[i] = convert(s[i]);
                    break;
                }
            }
        }
    }

    // You can uncomment the next line to see all k-mers.
    // cout << s << endl;
    cout << "Number of generated k-mers: " << counter << endl;
    cout << "Finish!" << endl;
    t = clock() - t;
    printf("It took me %d clicks (%f seconds).\n", t, ((float)t) / CLOCKS_PER_SEC);
    return 0;
}

Setelah kompilasi, jika kalian menjalankan kode, dibutuhkan sekitar It took me 69335 clicks (69.33 seconds). untuk menghasilkan semua 67 juta 13-m. Ini berarti Python membutuhkan waktu 3 kali lebih banyak untuk menjalankan algoritma yang sama dibandingkan dengan C ++.

Cara mempercepat Python

Saya ingin menekankan lagi, bahwa kedua kode tersebut ditulis dengan cara yang paling sederhana (dan mungkin paling tidak efisien). Ada puluhan pendekatan lain dalam Python yang dapat meningkatkan kinerja kode dan Anda harus mencobanya. Sebagai contoh, kita dapat menulis kode sederhana dengan Python yang hampir secepat C ++ untuk tujuan ini.

from itertools import product
for i in product(['A', 'C', 'G'], repeat=10):
    print(''.join(i))

Sebenarnya ada cara paling gampang untuk mempercepat python, yaitu kalian bisa gunakan pypy3 ini sudah saya buktikan sendiri, waktu yang dibutuhkan hanya Elapsed time is 3.27 seconds saja bahkan bisa mengalahkan C++ itu sendiri!

Kesimpulan

Selain itu, dalam contoh ini, saya tidak menggunakan pararel CPU atau GPU, yang harus dilakukan untuk jenis masalah ini juga dalam contoh ini, selain itu tidak terlalu melibatkan manajemen memori. Jika kita menyimpan hasilnya (misalnya karena beberapa alasan tertentu), maka manajemen memori bahkan dapat membuat perbedaan yang lebih signifikan antara runtime C ++ dan Python.

Namun demikian hal ini menunjukkan bahwa bahkan data scientist harus tahu tentang bahasa seperti C ++ jika mereka bekerja dengan data dalam jumlah besar atau proses yang berkembang secara eksponensial. Selain itu, tulisan diatas menunjukkan bahwa ada banyak cara untuk menulis kode efisien dengan Python yang harus dieksplorasi dan diuji, sebelum menggunakan C ++.

happy coding

Ref:

https://medium.com

http://www.cplusplus.com/reference/ctime/clock/

Leave a Reply

Your email address will not be published. Required fields are marked *

+ 53 = 59