Kayıt Ol

Giriş


Şifremi Kaybettim

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

soru ekleme

You must login to ask question.

Giriş


Kayıt Ol

Merhaba, kayıt formu üzerinden kayıt olabilirsiniz. Fakat sosyal medya ile kayıt olmanızı önermekteyiz.

Rust’ta Derlenmiş Kütüphaneyi Ctypes ile Python’da Kullanma

Rust’ta Derlenmiş Kütüphaneyi Ctypes ile Python’da Kullanma

 

Spoiler: İstediğimi (iyi bir performans) alamadım. Ayrıntısı için okuyun.

Selamlar. İlginç bir konuyla karşınızdayım bu sefer. ctypes ile C’de yazdığımız kaynakları Python’da kullanabiliyoruz. Bu, düşük seviye sisteme erişebilmemizi sağlıyor ve aynı zamanda performans sağlıyor. Bu aralar Rust’a kafa yormaktayım. Rust da C gibi derlenen dillerden. Yani kaynak kodumuzu önce binary’ye derliyor, sonra çalıştırıyoruz. Dolayısıyla acaba Rust’ta yazdığım bazı fonksiyonları kütüphane olarak (Linux’te SO, Windows’ta DLL) derledikten sonra Python’dan çağırabilir miyim, merak ettim. Buna eğilimimin olmasının sebebi şunlar;

  • Merak: Başıma ne gelirse artık
  • Bazı durumlarda düşük seviyeli bir dilde işlem (computation) yapmanın daha hızlı olması: Quora’nın kurucularından biri olan Adam Dangelo da real-time bildirimler gibi bazı servisleri C++ ile yazıp Python ile birleştirmiş. Bu potansiyeli ileride kullanma olasılığımı düşündüm.

 

Bu sebeple, çok çok basit bir algoritma oluşturup, iki dilde de bunu gerçekleştirmeliydim. Ve bu algoritmanın iş yükü görece fazla olmalıydı. Aklıma döngüler geldi. Her iki dilde de sayının üssünü alan bir fonksiyon yazmayı uygun gördüm. Şöyle basit bir şey tasarladım:

İlk önce Rust’ta bir fonksiyon oluşturmalıydım. power.rs oluşturup içine fonksiyonu yazdım:

 

Güzel, bunu derleyelim:

Böylece aynı dizinde libpower.so dosyasını (Windows’ta libpower.dll) görüyoruz. Şimdi, düşük seviye bir kütüphaneyi nasıl import ediyorsak öyle yapacağız, aynı fonksiyonu Python’da yazacağız, zamanlarını ölçeceğiz. Aşağıdaki şekilde hallettim ben:

 

Gördüğünüz timing fonksiyonu bir decorator, fonksiyonun ne kadar sürede çalıştığını ölçebilmek için. powerof_python fonksiyonu da aynı algoritmanın Python’da yazılmış hali. Aşağıda da sonuçları bulunuyor:

İyi bakın. Burada garip bir şey var. Derlediğimiz kütüphaneden aldığımız fonksiyon, gariptir, Python fonksiyonundan uzun sürüyor.

Burada savunma yapmayacağım. Ben de bunu görünce “Neye bakıyorum ben böyle?” deyip Stackoverflow’da da sordum. Sorun şu ki, içi dolu bir cevap gelmedi. Sadece bazı spekülasyonlar var. Yorumlarda bir arkadaşın dediğine göre ctypes, kütüphanedeki türleri Python uyumlu türlere çevirebiliyor, bu da yavaşlığa sebep olabiliyor. Bu durumda Python.h kullanmanız gerekebilir. Ya da algoritmadan kaynaklı bir durum da olabilir. Yani, bir şekilde, farklı bağlamlarda daha hızlı sonuçlar elde edebileceğinize inanıyorum.

Neyse, burada bitirelim. Son olarak belirtmeliyim, gerçekten her bağlamda bu tür bir hıza ihtiyacınız olmayacak. Python, bellek yönetimi konusunda zaten iyi çalışıyor ve işinizi birçok durumda görecektir.


Buradan Nereye Gidebilirsin?

Hakkında Erdin ErayÇırak

Dilbilim öğrencisi, programlamaya meraklı, INTJ kişilik. Genelde web geliştirmeyle ilgilensem de kendi alanım sebebiyle doğal dil işleme ve bilgisayar dilbilimle de yakından ilgiliyim.


Beni Takip Et

Yorum ( 1 )

  1. Main in içine ->
    p = powerof
    pp = powerof_python
    time1 = time.time()
    for x in range(100):
    p(2, x)
    time2 = time.time()
    for x in range(100):
    pp(2, x)
    time3 = time.time()
    print(‘{} function took {:0.4f} ms’.format(“c”, (time2 – time1) * 1000.0))
    print(‘{} function took {:0.4f} ms’.format(“python”, (time3 – time2) * 1000.0))

    eklersen daha ilginç bir sonuçla karşılaşacaksın. Olay C’den çok python’un optimizasyonlarıyla ilgili sanırım.

Bir Cevap Yaz

Captcha Captcha güncellemek için resime tıkla