- C codeni compilyatsiya qilib beradi
gcc main.c -o main
./main
- Python code ishga tushuradi
python3 main.py
- C da yozilgan code ni
.so
ga o'tkazib beradi
gcc -shared -o main.so -fPIC main.c
gcc
: Bu GNU Compiler Collection, C va boshqa tillar uchun keng qo'llaniladigan kompilyator.-shared
: Bu parametr kompilyatorga umumiy kutubxona (yoki dinamik kutubxona) yaratishni aytadi. Umumiy kutubxona — bu kompilyatsiyadan o'tgan funksiya va ma'lumotlar to'plami bo'lib, ularni turli dasturlar ishlatishlari mumkin. Linux tizimlarida ushbu parametr odatda.so
kengaytmasiga ega fayl yaratadi.-o main.so
: Bu parametr chiqish fayl nomini belgilaydi.-o
opsiyasi kompilyatorga chiqish faylinimain.so
deb nomlashni aytadi. Sizmain
o‘rniga kutubxonangiz uchun istalgan nomni qo‘yishingiz mumkin.-fPIC
: Bu "Position-Independent Code" (Manzilga Bog'liq Bo'lmagan Kod) degan ma'noni anglatadi. Bu parametr kompilyatorga xotirada yuklangan aniq manzildan mustaqil bo'lgan mashina kodi yaratishni aytadi. Bu umumiy kutubxonalar uchun zarur, chunki ularni turli dasturlar tomonidan xotiraning turli manzillariga yuklash mumkin.main.c
: Bu umumiy kutubxonaga kompilyatsiya qilinadigan manba fayl.main.c
fayli siz yaratmoqchi bo'lgan umumiy kutubxona uchun kodni o'z ichiga oladi.
- Ushbu buyruq
main.c
faylini umumiy kutubxonamain.so
ga kompilyatsiya qiladi va manzilga bog'liq bo'lmagan kod yaratadi.
- Bu buyruqdan mustaqil bajariladigan dasturdan ko'ra, umumiy kutubxona yaratmoqchi bo'lganingizda foydalaniladi. Umumiy kutubxonalar turli dasturlar tomonidan ishlatilishi mumkin bo'lgan qayta ishlatiladigan kod yaratishda foydalidir, bu esa takrorlanishni kamaytiradi va yangilanishlarni osonlashtiradi.
// main.c
#include <stdio.h>
int main(){
printf("Hi Python\n");
return 0;
}
- Yuqoridagi C code ni Python code ga chaqirish
# main.py
import ctypes
code = ctypes.CDLL("./main_1.so")
code.main()
- ishga tushurish
gcc -shared -o main.so -fPIC main.c
python3 main.py
- C da
fibonacci
n-darajasini aniqlash funksiyasi
// main_4.c
int fib(int n) {
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
- Bu Python da
fibonacci
n-darajasini aniqlash funksiyasi va C da yozilganfibonacci
func code ni chaqirib ishlatib farqini ko'ramiz
import time
import ctypes
code = ctypes.CDLL('./main_4.so')
code.fib.argtypes = (ctypes.c_int,)
code.fib.restype = ctypes.c_int
n = 35 # N-ni aniqlash # noqa
# Fibonacci sonini Python'da hisoblash # noqa
def python_fib(n):
if n <= 1:
return n
return python_fib(n - 1) + python_fib(n - 2)
# 1. Python kodini sinash # noqa
start_time = time.time()
python_result = python_fib(n)
python_time = time.time() - start_time
print(f"Python'da vaqt: {python_time:.6f} soniya, Natija: {python_result}") # noqa
# 2. C kodini sinash # noqa
start_time = time.time()
c_result = code.fib(n)
c_time = time.time() - start_time
print(f"C'da vaqt: {c_time:.6f} soniya, Natija: {c_result}") # noqa
# Vaqt farqini chiqaramiz # noqa
print(f"C kodining tezligi Python'dan {python_time / c_time:.2f} marta tezroq") # noqa
- ishga tushurish
gcc -shared -o main_4.so -fPIC main_4.c
python3 main_4.py
- Natija
Python'da vaqt: 1.116683 soniya, Natija: 9227465
C'da vaqt: 0.049001 soniya, Natija: 9227465
C kodining tezligi Python'dan 22.79 marta tezroq
Umid qilama sizga bu foydali buldi 😊
Telegram address: Engineering blog