Mempercepatkan kod Python dengan C (dan tiada perpustakaan tambahan)

WBOY
Lepaskan: 2024-08-21 15:47:02
asal
1008 orang telah melayarinya

NOTA: Asalnya disiarkan dalam Substack saya: https://open.substack.com/pub/andresalvareziglesias/p/speeding-up-python-code-with-c-and

Python bukan paradigma kelajuan, kita semua tahu ini. Tetapi kami boleh mempercepatkan beberapa bahagian kritikal apl kami dengan bantuan rakan lama kami yang baik C.

Speeding up Python code with C (and no extra libraries)

Urutan Fibonacci dalam Python biasa

Jujukan Fibonacci ialah contoh klasik yang digunakan untuk mengajar pembangunan perisian. Merupakan satu siri nombor yang bermula dengan 0 dan 1. Setiap nombor berikutnya ialah hasil tambah dua sebelumnya. Jadi, urutannya seperti ini: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Kita boleh membangunkan Fibonacci dalam python dengan cara ini:

import time

# Configure iterations
iterations = 30

# Define fibonacci in native python
def fibonacci(n):
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

# Calculate in pure python
start_time = time.perf_counter()
print(f"Calculating {iterations} iterations of fibonacci...")
print(fibonacci(iterations))
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
print(f"Execution time: {execution_time_ms:.2f} milliseconds")
print()
Salin selepas log masuk

Jika kami melaksanakan Python tulen ini (dalam mesin maya Google IDX) versi Fibonacci, kami mendapat:

  • 10 lelaran: 5.77 milisaat
  • 30 lelaran: 984.36 milisaat
  • 50 lelaran: (Saya perlu membatalkan proses, terlalu banyak masa)

Urutan Fibonacci dalam C

Kita boleh membangunkan urutan yang sama dalam C biasa:

#include <stdio.h>

int fibonacci(int n) {
    if (n <= 1) {
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
Salin selepas log masuk

Kompilasi pustaka dengan GCC:

gcc -o fibonacci.so -shared -fPIC -O2 fibonacci.c
Salin selepas log masuk

Kini, kami mempunyai perpustakaan binari asli dengan fungsi urutan fibonacci di dalamnya. Kita boleh membenamkan pustaka ini di dalam apl Python dengan ctypes (pustaka jenis Python C, kerana Python itu sendiri dibangunkan dalam C):

import time
from ctypes import c_double, c_int, CDLL

# Configure iterations
iterations = 30

# Import the C library
library = CDLL('./fibonacci.so')
fibonacciAsLibrary = library.fibonacci
fibonacciAsLibrary.restype = c_int

# Calculate as C library
start_time = time.perf_counter()
print(f"Calculating {iterations} iterations of fibonacci as C library...")
print(fibonacciAsLibrary(iterations))
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
print(f"Execution time: {execution_time_ms:.2f} milliseconds")
print()
Salin selepas log masuk

Sekarang, jika kami melaksanakan versi ini pada Fibonacci, kami mendapat:

  • 10 lelaran: 0.54 milisaat
  • 30 lelaran: 6.92 milisaat
  • 50 lelaran: 82324.90 milisaat

Lebih baik, bukan?

Gunakan kes untuk penyepaduan Python dan C

Kami boleh menggunakan penyepaduan jenis ini dalam banyak apl dan senario, seperti:

  • Percepatkan penyeri bersiri dan penyahserialisasi dalam apl Django kami
  • Percepatkan bahagian kritikal pada aliran kerja
  • Interaksi tahap rendah dengan OS
  • Dll.

Dan anda? Bagaimanakah anda akan menggunakan helah kecil ini dalam projek anda? Saya suka mendengar komen anda!

Mengenai senarai

Di antara siaran Python dan Docker, saya juga akan menulis tentang topik lain yang berkaitan (sentiasa topik teknologi dan pengaturcaraan, saya berjanji... dengan bersilang jari), seperti:

  • Seni bina perisian
  • Persekitaran pengaturcaraan
  • Sistem pengendalian Linux
  • Dll.

Jika anda menemui beberapa teknologi yang menarik, bahasa pengaturcaraan atau apa sahaja, sila beritahu saya! Saya sentiasa terbuka untuk mempelajari sesuatu yang baharu!

Mengenai penulis

Saya Andrés, pembangun perisian tindanan penuh yang berpangkalan di Palma, dalam perjalanan peribadi untuk meningkatkan kemahiran pengekodan saya. Saya juga seorang penulis fantasi yang diterbitkan sendiri dengan empat novel terbitan atas nama saya. Sila tanya saya apa-apa sahaja!

Atas ialah kandungan terperinci Mempercepatkan kod Python dengan C (dan tiada perpustakaan tambahan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!