Mengapa kode python saya sangat lambat?

Saat saya mulai memikirkan artikel ini, feed Medium saya menghasilkan postingan joker “Python sebenarnya tidak lambat” — saya membacanya meskipun saya tahu itu tidak benar dan hanya clickbait. Ketika berbicara tentang Python, Anda berurusan dengan siput, dan meskipun Anda dapat melatih siput, Anda tidak dapat lepas dari genetik dasarnya (tidak seperti Ethan Hawke di film klasik Gattaca)

Tolok ukur

Saya mulai menulis beberapa tolok ukur sederhana untuk menguji silang dalam C, Rust, Java, dan Python. Saya pikir kategori utama untuk dievaluasi

  • Mengelola tekanan memori (pembuatan/penghancuran objek)
  • Pemrosesan string seperti JSON
  • Loop dan operasi intensif komputasi

Sebagai referensi, ada proyek hebat GitHub yang mengevaluasi kinerja di lebih dari selusin bahasa. Tabel ringkasan disertakan di bawah ini, dan jika C++ adalah garis dasar 1, maka Python 227x lebih lambat pada tes brainf (yang merupakan juru bahasa Turing Machine yang cukup menarik)

Atas kebaikan proyek github oleh Kostya M

Saya akhirnya menulis tes cuplikan super dasar karena saya sadar saya lupa cara memprogram di sebagian besar bahasa ini. Saya harus mengatur ulang ambisi saya agar sesuai dengan keterampilan saya yang lemah

© Doug Foo LabsWawasan dari hasil tes

Saya akan menautkan ke GitHub saya untuk pengujian yang benar-benar meretas di bagian Referensi. Saya harap penamaannya cukup jelas

Ini adalah takeaways saya di seluruh bahasa

  1. Python File I/O relatif cepat karena faktor pembatasnya adalah disk
  2. Python luar biasa lambat dalam rekursi, melakukan Fibonacci rekursif menjadi sangat lambat hanya dengan fib(30)
  3. Panggilan fungsi Python lambat — berkontribusi pada masalah rekursi
  4. Java tanpa optimasi JIT bisa sangat lambat, bahkan lebih lambat dari Python untuk beberapa hal
  5. String asli Java + masih sangat lambat (100x), menggunakan StringBuilder membuatnya cukup cepat, tetapi lebih lambat dari Python
  6. Java dengan JIT cukup cepat akhir-akhir ini, hampir tidak layak menggunakan C lagi…
  7. Karat sangat cepat, bisa lebih cepat jika saya tahu cara membuat kode dengan lebih baik…

Tolok ukur 200x lebih lambat belum terbukti dalam kit kecil saya, tetapi jelas, beberapa panggilan fungsi tambahan dan rekursi dan Anda akan dengan mudah mencapainya

Jadi mengapa Python lambat?

Kebanyakan hal sudah jelas tetapi izinkan saya mencantumkannya

  1. Python ditafsirkan dan ketika dikompilasi byte itu tidak benar-benar dioptimalkan
  2. Itu adalah sampah yang dikumpulkan, tetapi terutama menggunakan penghitungan referensi sehingga sedikit lebih cepat atau setidaknya lebih deterministik daripada Jawa
  3. Secara default tidak memiliki kompiler JIT - tampaknya penting untuk bahasa yang ditafsirkan (PyPy menggunakan ini untuk memberikan peningkatan 10x)
  4. Menjadi bahasa dinamis yang tidak diketik memiliki titik lambat (dan membuatnya lebih sulit untuk membangun JIT)
  5. Implementasi panggilan fungsi sangat lambat (mungkin beberapa kompleksitas alokasi bingkai tumpukan?)

Catatan kami bahkan tidak menguji multithreaded atau multi-pemrograman karena kita semua tahu Python juga memiliki masalah GIL (Global Interpreter Lock)

Cara mengoptimalkan Python

Ada beberapa trik untuk mempercepat Python, tetapi kebanyakan tidak terlalu bagus

  1. Gunakan multi-pemrosesan untuk menelurkan pekerja (tetapi berhati-hatilah karena Anda akan dibatasi oleh GIL )
  2. Tulis kode C asli dan tautkan ke Python
  3. Gunakan fungsi Python asli (yang ditulis dalam runtime di C)
  4. Pemahaman daftar 1-liner tampaknya dioptimalkan untuk kinerja sehingga sepertinya itu bukan hanya trik keren

Sejujurnya saya tidak melihat banyak tip bagus… beberapa tip seperti “gunakan algoritma O(n) dan O(n-log n) alih-alih O(n²)”… mungkin tip pertama adalah mempelajari beberapa komputer

Python adalah salah satu bahasa pemrograman paling populer di kalangan developer. Itu digunakan di mana-mana, baik itu pengembangan web atau pembelajaran mesin

Ada banyak alasan untuk popularitasnya, seperti dukungan komunitasnya, perpustakaannya yang luar biasa, penggunaannya yang luas dalam Machine Learning dan Big Data, dan sintaksisnya yang mudah.

Meskipun memiliki banyak kualitas tersebut, python memiliki satu kelemahan, yaitu kecepatannya yang lambat. Menjadi bahasa yang ditafsirkan, python lebih lambat dari bahasa pemrograman lainnya. Namun, kita bisa mengatasi masalah ini dengan menggunakan beberapa tips

Pada artikel ini, saya akan membagikan beberapa trik python yang dapat kita gunakan untuk membuat kode python kita berjalan lebih cepat dari biasanya. Mari kita mulai

 

1. Algoritma & Struktur Data yang Tepat

 

Setiap struktur data memiliki pengaruh yang signifikan terhadap runtime. Ada banyak struktur data bawaan seperti daftar, tupel, set, dan kamus di python. Kebanyakan orang menggunakan struktur data daftar dalam semua kasus

Dalam python, set dan kamus memiliki kinerja pencarian O(1) karena mereka menggunakan tabel hash untuk itu. Anda dapat menggunakan set dan kamus sebagai ganti daftar dalam kasus berikut

  • Anda tidak memiliki item duplikat dalam koleksi
  • Anda perlu mencari item berulang kali dalam koleksi
  • Koleksinya berisi sejumlah besar item

Anda dapat melihat kompleksitas waktu dari berbagai struktur data dalam python di sini

Kompleksitas Waktu melalui Python Wiki
Halaman ini mendokumentasikan kerumitan waktu (alias "Big O" atau "Big Oh") dari berbagai operasi di CPython saat ini

 

2. Menggunakan Fungsi dan Pustaka Bawaan

 
Fungsi bawaan Python adalah salah satu cara terbaik untuk mempercepat kode Anda. Anda harus menggunakan fungsi python bawaan kapan pun diperlukan. Fungsi bawaan ini telah diuji dan dioptimalkan dengan baik

Alasan fungsi bawaan ini cepat adalah karena fungsi bawaan python, seperti min, maks, semua, peta, dll. , diimplementasikan dalam bahasa C

Anda harus menggunakan fungsi bawaan ini alih-alih menulis fungsi manual yang akan membantu Anda mengeksekusi kode lebih cepat

Contoh

newlist = []

for word in wordlist:
    newlist.append(word.upper())


Cara yang lebih baik untuk menulis kode ini adalah

newlist = map(str.upper, wordlist)
_


Di sini kita menggunakan fungsi peta bawaan, yang ditulis dalam C. Oleh karena itu, jauh lebih cepat daripada menggunakan loop

 

3. Gunakan Banyak Tugas

 
Jika Anda ingin menetapkan nilai dari beberapa variabel, maka jangan menetapkannya baris demi baris. Python memiliki cara yang elegan dan lebih baik untuk menetapkan banyak variabel

Contoh

firstName = "John"
lastName = "Henry"
city = "Manchester"


Cara yang lebih baik untuk menetapkan variabel-variabel ini adalah

firstName, lastName, city = "John", "Henry", "Manchester"


Penugasan variabel ini jauh lebih bersih dan elegan daripada yang di atas

 

4. Lebih suka Pemahaman Daftar Daripada Loops

 
Pemahaman daftar adalah cara yang elegan dan lebih baik untuk membuat daftar baru berdasarkan elemen dari daftar yang ada hanya dalam satu baris kode

Pemahaman daftar dianggap sebagai cara yang lebih Pythonic untuk membuat daftar baru daripada mendefinisikan daftar kosong dan menambahkan elemen ke daftar kosong itu

Keuntungan lain dari pemahaman daftar adalah lebih cepat daripada menggunakan metode append untuk menambahkan elemen ke daftar python

Contoh

Menggunakan daftar menambahkan metode

newlist = []
for i in range(1, 100):
    if i % 2 == 0:
        newlist.append(i**2)
_


Cara yang lebih baik menggunakan pemahaman daftar

newlist = [i**2 for i in range(1, 100) if i%2==0]


Kode terlihat lebih bersih saat menggunakan pemahaman daftar

 

5. Impor yang Tepat

 
Anda harus menghindari mengimpor modul dan pustaka yang tidak diperlukan sampai dan kecuali Anda membutuhkannya. Anda dapat menentukan nama modul alih-alih mengimpor pustaka lengkap

Mengimpor pustaka yang tidak diperlukan akan memperlambat kinerja kode Anda

Contoh

Misalkan Anda perlu mengetahui akar kuadrat dari sebuah angka. Alih-alih ini

import math
value = math.sqrt(50)
_


Gunakan ini

from math import sqrt
value = sqrt(50)


6. Penggabungan String

 
Dalam python, kami menggabungkan string menggunakan operator '+'. Tapi cara lain untuk menggabungkan string dengan python adalah menggunakan metode join

Metode gabung adalah cara yang lebih pythonic untuk menggabungkan string, dan juga lebih cepat daripada menggabungkan string dengan operator '+'

Alasan mengapa metode join() lebih cepat adalah karena operator '+' membuat string baru dan kemudian menyalin string lama di setiap langkah, sedangkan metode join() tidak bekerja seperti itu.

Contoh

output = "Programming" + "is" + "fun
_


Menggunakan metode bergabung

output = " ".join(["Programming" , "is", "fun"])
_


Output dari kedua metode akan sama. Satu-satunya perbedaan adalah metode join() lebih cepat daripada operator '+'

Bagaimana cara mempercepat kode Python?

Mari kita mulai. .
Algoritma & Struktur Data yang Tepat. Setiap struktur data memiliki pengaruh yang signifikan terhadap runtime. .
Menggunakan Fungsi dan Pustaka Bawaan. Fungsi bawaan Python adalah salah satu cara terbaik untuk mempercepat kode Anda. .
Gunakan Banyak Tugas. .
Lebih suka Pemahaman Daftar Daripada Loops. .
Impor yang Tepat. .
Penggabungan String

Mengapa kode saya berjalan sangat lambat Python?

Singkatnya. Jadi singkatnya semuanya di sini python lambat terutama karena dua alasan utama. Salah satunya adalah secara dinamis mengetik bahasa yang berarti, tidak seperti di java, python tidak memiliki deklarasi variabel dan ini membuatnya cukup lama untuk dikompilasi dan kadang-kadang variabel berubah selama .

Mengapa Python tidak cepat?

Karena Python adalah bahasa pemrograman yang diketik secara dinamis , Python mengkompilasi lebih cepat daripada bahasa lain tetapi berjalan lebih lambat.

Berapa banyak RAM yang dibutuhkan untuk Python?

RAM. Setiap laptop untuk Pemrograman Python harus memiliki setidaknya 8 GB RAM . Tapi saya sarankan untuk mendapatkan setidaknya 16 GB RAM jika Anda mampu membelinya. Sebab, semakin besar RAM, semakin cepat pengoperasiannya.