Python kodu C koduna çevrilebilir mi?

Merhaba, Python kodunu pyinstaller ile derlediğimde kısa bir kod bile çok fazla yer kaplıyor bu yüzden C ye çevirip derlemek istiyorum ki fazladan dosyalar olmadan derleyip çalıştırabileyim. Çünkü pyinstaller ile derlediğimde onefile ı seçince exe dosyası çok fazla yer kaplıyor. onefile olmayınca da bir sürü dosya oluşuyor. Cython’u biraz araştırdım da galiba Cython farklı bir dil çünkü dökümantasyonlar da şu tarz sonuçlara ulaştım:

%%cython

cdef int a = 0
for i in range(10):
    a += i
print(a)

Program ayni kaldigi surece kaynak kodunun hangi dilde yazildigi dosya boyutunu (cok) etkilemez.

Bu dosyalarin icerikleri neler? Ne kadari python kodu ki C’ye cevirince kuculeceklerini dusunuyorsun?

1 Beğeni

Yazdığımız kodun boyutu derlemediğimiz sürece pek değişiklik göstermiyor asıl sorun derlediğimde oluşuyor.

Henüz kodları yazmaya başlamadım ancak pyinstaller ile derlediğim bazı programlar vardı ve çok yer kaplıyorlardı bu yüzden python kodunu c ye çevirip gcc ile derlemeyi düşündüm. Pyinstaller ile derlenen kodlar eski bilgisayarımda kaldı ve pyinstaller ı yüklerken hata oluştuğu için burada deneyemedim ancak örnek olması için bir link vereyim: Pyinstaller ile derlenen bir hello world programı

tek satırlık bu kod pyinstaller ile derlendiğinde sadece exe dosyası bile 1362kb ancak az önce gcc yükleyip c ile bir hello world programı yazdım ve kod daha uzun olmasına rağmen derlediğimde sadece 40kb yer kaplıyor. Bu yüzden python kodunu c ye çevirip derlenen kodun daha az yer kaplamasını sağlamaya çalışıyorum. Ayrıca pyinstaller ile derlediğim programlar açılırken bekletiyolar ancak gcc ile derlediğim program hemen açıldı.

Python ile C’de yazilan hello world programlari birbirinden son derece farkli. Bir tanesi python bytecode’una donusup runtime tarafindan calistiriliyor ve python standart kutuphanesine cagrida bulunuyor. Digeri C runtime tarafindan cagrilip sistemde zaten yuklu libc’deki bir fonksiyonu cagiriyor.

Yazdigin kod hello world ise ikisi arasinda fark goremeyebilirsin fakat kod bundan birazcik daha karmasiklastiginda programlar elmayla armuta donusuyor.

Windows’da python modul yukleme yavasligi bilinen bir sorun.

Bu muhtemelen bir suru kutuphane kullandigini gosteriyor. Bu kutuphaneleri de C’ye cevirmeyi dusunuyor musun? Ayrica yer kaplayan seyin python runtime/overhead’i oldugundan emin misin? Yanlarinda DLL’lerle geliyor olabilirler.

Nasil anlatabilecegimi bilmiyorum[1], ama sunlari soyleyeyim:

  1. Kocaman/daginik exe’de yer kaplayan sey python kodu olmayabilir. Icerigini incelemen lazim.
  2. Program ayni kaldigi surece kaynak kodunun hangi dilde yazildigi dosya boyutunu (cok) etkilemez. Tutup butun programi C veya Cython gibi bir dile port edersen bambaska bir program yazmis olursun. (Bu arada hic denedin mi, yoksa elle hic yapmadigin bir seyi otomatiklestirmeye mi calisiyorsun?)
  3. Dilleri birbirine cevirmeye calisan otomatik aletler bazen bulunabiliyor. Nadir durumlarda bu isi elle yapmaktan daha hizli bile olabiliyorlar.

…ve asil soruya geliyoruz:

Neden C’de yazmiyorsun?

pyinstaller tüm standart python modüllerini ve python yorumlayıcısını da derlenen uygulamaya ekliyordu yanlış hatırlamıyorsam.

Eğer python daki programı c veya cython da baştan yazmaktan bahsediyorsanız hayır, hiç denemedim (Hello world denemesi hariç).

C bilmiyorum (Hello world örneği bile birkaç hata düzeltmesi ile 5 dakika almıştır :D)
Birde neden özellikle C ye taktın dersen.
Pygame öğrenmeyi düşünüyorum çünkü zaten python bilgim var o yüzden oyun yazmak daha kolay olur. Yeni bir dil öğrenip birde grafik kütüphanesi öğrenmekten daha kısa olur.
Pygame in wikipedia daki sayfasını okuyunca C ve birkaç tane daha dil ile yazıldığını gördüm o yüzden kodu C ye çevirmeyi düşündüm çünkü pyinstaller da derlediğim programlar yavaş açılıyordu ve pygame yazılırken zaten C de kullanıldığı için oyunun kodunu C ye çevirdiğim de sorun çıkarmaz diye düşündüm.

C bilmiyorsan python’dan cevrilen C kodunda cikacak hatalari da duzeltemezsin demek malesef :(. Neyse ki ogrenmesi kolay bir dil.

Bu konuda haklisin.
Gerci 4-5 grafik kutuphanesi kullandiktan sonra hepsinin birbirine benzedigini fark ediyorsun. Scene yapisi, sprite’lar, double-buffered rendering, rect’ler…

C oyle bir dil degil.
C’de yazilmis kod cagrilirken hangi dilde yazilan kod tarafindan cagrildigini bilmiyor bile. Hatta C’nin diger dillerden daha fazla sikinti cikartma ihtimali var.

Pygame C’de yazilmis olabilir ama C icin yazilmamis. (Kodu incelemeden soyluyorum) herhangi bir C kodu tarafindan calistirilmasina imkan yok; python’dan kullanmak bin kat daha kolay olacaktir.

Ve burada yukaridaki bir noktaya geri donuyorum: Programin hangi dilde yazildigi onemli degil, ne yaptigi onemli. C’de yazan kod kendi python runtime’ini kaldirip pygame’in python arayuzunu kullanacaksa python kodundan daha kucuk olmaz, olamaz. Yazmasi da bi 8 kat daha zor olur.

Pygame’de oyun yazacaksan pygame’de oyun yazmani tavsiye ediyorum. Yavas kisimlar cikarsa profile edersin, debug edersin. (Kodunu C’ye cevirmeyi planladigin noktada zaten ogrenmen gerekecek basit beceriler bunlar.)

3 Beğeni

Yani C ye çevirmeye gerek olmadan hızlı çalışabilir mi (ki söylediklerinize göre zaten çevirsem bile hata verecek) ? Eğer öyleyse sorun çözülmüş oluyor. Teşekkürler.

Burayı anlamadım. Python runtime ı biliyorum ama python arayüzü ne oluyor ?

Bu arada Cython’a baktim (Cython - an overview — Cython 3.0.0a10 documentation ¶3) disari cagri yapmayan kodu hizlandirmakla beraber dosya boyutunda buyuk bir azalmaya neden olmaz gibi duruyor. (Hatta arttirabilecegi senaryolar bile hayal edebiliyorum ama tabi python internal’larina cok hakim degilim)

Hizlidan kasit nedir ki?

Python’da yapilmis bir suru oyun var. Kendi yaptigim oyunlar ve animasyonlar da gayet guzel calisti simdiye kadar. (Hatta duz C kodundan kat be kat hizli calistilar, kutuphaneler sagolsun.)

Pygame’in python’dan cagrilabilen fonksiyonlari.

pyinstaller ile derlediğim programlar yavaş açılıyordu. Birde python kodu çalıştırmadan önce bytecode a çevirdiğinden o da programı yavaşlatır diye düşünmüştüm. Birde izlediğim bir videoda python ile birkaç dili karşılaştırıyorlardı, karşılaştırılan diller kodu daha hızlı çalıştırmışlardı ama python yaklaşık 1 dakika da çalıştırmıştı. Çalıştırmıştı derken kod çalışmaya başlamıştı da tüm işlemleri yerine getirmesi 1 dakika alıyordu.

Anladım teşekkürler.

Cevirme onceden yapilip pyc dosyalarinda cache’leniyor. Asil yavas olan bytecode’u calistiran virtual machine. Hizli calisan diller CPU’nun dogrudan calistiracagi koda donusuyor.

Belli, hatta duz kodla hesaplama yapan bir programdir. Onlarda cok yavas python.

1 Beğeni

Aynen, numpy gibi modüller de daha iyi performans vardı sanırım.