PyPy'ye başlarken

0 Hisse senetleri
0
0
0
0

giriiş

Python programlama dili, birçok farklı şekilde uygulanabilen bir arayüzdür. Bazı örnekler arasında C dilini kullanan CPython, Java kullanılarak uygulanan Jython vb. yer almaktadır.

En popüler olmasına rağmen, CPython en hızlısı değil. PyPy, hem uyumlu hem de hızlı olan alternatif bir Python uygulamasıdır. PyPy, uzun süren işlemlerin yürütme süresini önemli ölçüde azaltan JIT derlemesine dayanır.

Bu eğitimde, yeni başlayanlar için PyPy'yi tanıtacağız ve CPython'dan farklılıklarını vurgulayacağız. Ayrıca avantajlarını ve sınırlamalarını da ele alacağız. Ardından, basit bir Python betiğini çalıştırmak için PyPy'yi nasıl indireceğimizi ve kullanacağımızı inceleyeceğiz.

Bu eğitim özellikle aşağıdaki konuları kapsamaktadır:

  • CPython'a kısa bir genel bakış
  • PyPy'ye ve özelliklerine giriş
  • PyPy'nin sınırlamaları
  • Ubuntu üzerinde PyPy çalıştırmak
  • PyPy ve CPython çalışma zamanı karşılaştırması

CPython'a kısa bir genel bakış

PyPy'yi ele almadan önce, CPython'un nasıl çalıştığını anlamak önemlidir. Aşağıda, CPython kullanılarak uygulanan bir Python betiğinin yürütme hattının bir resmini görebilirsiniz.

Verilen bir Python betiği (.py) için, kaynak kod öncelikle CPython derleyicisi kullanılarak bayt koduna derlenir. Bayt kodu oluşturulur ve pyc uzantılı bir dosyaya kaydedilir. Ardından bayt kodu, CPython yorumlayıcısı kullanılarak sanal bir ortamda yürütülür.

Kaynak kodu bayt koduna dönüştürmek için derleyici kullanmanın avantajları vardır. Derleyici kullanılmazsa, yorumlayıcı doğrudan kaynak kod üzerinde çalışır ve onu satır satır makine koduna çevirir. Bunun dezavantajı, her bir kaynak kod satırını makine koduna çevirmek için bazı işlemlerin uygulanması ve bu işlemlerin her satır için tekrarlanmasıdır. Örneğin, sözdizimi analizi diğer satırlardan bağımsız olarak her satıra uygulanır ve bu nedenle yorumlayıcı kodu çevirmek için çok zaman harcar. Derleyici bu sorunu çözer çünkü tüm kodu aynı anda işleyebilir ve bu nedenle sözdizimi analizi her kod satırı için değil, yalnızca bir kez uygulanır. Bu nedenle derleyiciden üretilen bayt kodu kolayca yorumlanır. Tüm kaynak kodun derlenmesinin bazı durumlarda yararlı olmayabileceğini ve PyPy'yi tartışırken bunun açık bir örneğini göreceğimizi unutmayın.

Bayt kodu oluşturulduktan sonra, sanal makinede çalışan yorumlayıcı tarafından yürütülür. Sanal ortam faydalıdır çünkü CPython bayt kodunu makineden bağımsız hale getirerek Python'ı platformlar arası uyumlu kılar.

Ne yazık ki, yalnızca bayt kodu üretmek için bir derleyici kullanmak CPython yürütme hızını artırmak için yeterli değildir. Yorumlayıcı, kod her yürütüldüğünde makine koduna çevirerek çalışır. Dolayısıyla, bir satırın yürütülmesi LX saniye sürüyorsa, 10 kez yürütülmesi X*10 saniyeye mal olur. Uzun süren işlemler için bu, yürütme süresi açısından çok maliyetlidir.

CPython'daki hatalara dayanarak, şimdi de PyPy'ye bir göz atalım.

PyPy'ye ve özelliklerine giriş

PyPy, hem uyumlu hem de hızlı olan, CPython'a benzer bir Python uygulamasıdır. "Uyumlu" demek, PyPy'nin CPython ile uyumlu olduğu, yani neredeyse tüm CPython komutlarını PyPy'de kullanabileceğiniz anlamına gelir. Burada belirtildiği gibi, bazı uyumluluk farklılıkları vardır. PyPy'nin en büyük avantajı hızıdır. PyPy, CPython'dan çok daha hızlıdır. Daha sonra PyPy'nin yaklaşık 7 kat daha hızlı performans gösterdiği bazı testler göreceğiz. Bazı durumlarda CPython'dan onlarca hatta yüzlerce kat daha hızlı bile olabilir. Peki PyPy bu hızı nasıl elde ediyor?

Hız

PyPy, Python betiklerini önemli ölçüde hızlandırabilen anlık (JIT) bir derleyici kullanır. CPython'da kullanılan derleme türü, tüm kodun yürütülmeden önce bayt koduna çevrildiği önceden derleme (AOT) yöntemidir. JIT ise kodu yalnızca çalışma zamanında, yalnızca ihtiyaç duyulduğunda çevirir.

Kaynak kod, hiç çalıştırılmayan ancak yine de AOT derleyicisi kullanılarak çevrilen kod blokları içerebilir. Bu da işlem sürelerinin yavaşlamasına neden olur. Kaynak kod büyük ve binlerce satır içeriyorsa, JIT kullanmak büyük fark yaratır. AOT ile tüm kaynak kod çevrilir ve bu nedenle çok zaman alır. JIT ile ise yalnızca kodun gerekli kısımları çalıştırılır, bu da işlemi çok daha hızlı hale getirir.

PyPy bir kod parçasını çevirdikten sonra, bu kod önbelleğe alınır. Bu, kodun yalnızca bir kez çevrildiği ve çevirinin daha sonra kullanıldığı anlamına gelir. CPython yorumlayıcısı, kod her çalıştırıldığında çeviriyi tekrarlar; bu da yavaş olmasının bir başka nedenidir.

Zahmetsiz

PyPy, Python betiklerinin performansını artırmanın tek yolu değil, ancak en kolay yolu. Örneğin, Cython, C türlerinin değişkenlere atanmasını hızlandırmak için kullanılabilir. Sorun şu ki, Cython geliştiricinin kaynak kodunu manuel olarak incelemesini ve optimize etmesini gerektiriyor. Bu zahmetli ve kod boyutu arttıkça karmaşıklığı da artıyor. PyPy kullanırken ise, herhangi bir çaba harcamadan normal Python kodunu çok daha hızlı çalıştırabilirsiniz.

Yığın yok

Standart Python, C yığınını kullanır. Bu yığın, birbirlerinden çağrılan (geri dönüş yapan) fonksiyonların sırasını saklar. Yığının boyutu sınırlı olduğundan, fonksiyon çağrılarının sayısı da sınırlıdır.

PyPy, C yığınını kullanmayan bir Python uygulaması olan Stackless Python'ı kullanır. Bunun yerine, fonksiyon çağrılarını nesnelerle birlikte yığında depolar. Yığın boyutu, yığın boyutundan daha büyüktür, bu nedenle daha fazla fonksiyon çağrısı yapabilirsiniz.

Yığınsız Python, normal Python iş parçacıklarından daha iyi olan mikro iş parçacıklarını da destekler. Yığınsız bir Python iş parçacığında, tek bir iş parçacığında çalışan "tasklet" adı verilen binlerce görevi çalıştırabilirsiniz.

Görev parçacıkları (tasklet) kullanmak, görevlerin eş zamanlı olarak yürütülmesine olanak tanır. Eş zamanlılık, iki görevin aynı anda çalışması ve aynı kaynakları paylaşması anlamına gelir. Bir görev bir süre çalışır, ardından ikinci görevin çalışması için yer açmak üzere durur. Bunun, iki ayrı ancak eş zamanlı görevin çalıştırılmasını içeren paralellikten farklı olduğunu unutmayın.

Tasklet'lerin kullanımı, oluşturulan iş parçacığı sayısını azaltarak işletim sisteminin tüm bu iş parçacıklarını yönetme yükünü düşürür. Sonuç olarak, iki iş parçacığı arasında geçiş yaparak yürütmeyi hızlandırmak, iki görev arasında geçiş yapmaktan daha fazla zaman alır.

Stackless Python kullanımı, devamlılık (continuations) özelliğinin de önünü açtı. Devamlılık, bir görevin durumunu kaydetmemize ve daha sonra göreve devam etmek için geri yüklememize olanak tanır. Stackless Python'ın standart Python'dan farklı olmadığını, sadece daha fazla işlevsellik eklediğini unutmayın. Standart Python'da bulunan her şey Stackless Python'da da mevcuttur.

PyPy'nin faydalarını ele aldıktan sonra, bir sonraki bölümde sınırlamalarından bahsedelim.

PyPy'nin sınırlamaları

CPython'ı herhangi bir makinede ve herhangi bir işlemci mimarisinde kullanabilirsiniz, ancak PyPy'nin desteği nispeten sınırlıdır.

İşte PyPy tarafından desteklenen ve sürdürülen CPU mimarileri (kaynak):

  • x86 (IA-32) ve x86_64
  • ARM platformları (ARMv6 veya ARMv7, VFPv3 ile)
  • AArch64
  • PowerPC 64 bit, hem küçük hem de büyük endian
  • Sistem Z (s390x)

PyPy tüm Linux dağıtımlarında çalışmaz, bu nedenle desteklenen dağıtımlardan birini kullandığınızdan emin olmalısınız. Desteklenmeyen bir dağıtımda PyPy Linux ikili dosyasını çalıştırmak hata verecektir. PyPy yalnızca Python 2 ve Python 3'ün bir sürümünü destekler; bunlar PyPy 2.7 ve PyPy 3.6'dır.

PyPy'de çalışan kod tamamen Python ise, PyPy'nin sağladığı hız artışı genellikle önemli olur. Ancak, kod NumPy gibi C uzantıları içeriyorsa, PyPy aslında süreyi artırabilir. PyPy projesi aktif olarak geliştirilmektedir ve bu nedenle gelecekte C uzantıları için daha iyi destek sağlayabilir.

PyPy, Kivy gibi birçok popüler Python çerçevesi tarafından desteklenmemektedir. Kivy, CPython'ın Android ve iOS dahil tüm platformlarda çalışmasına olanak tanır. Bu da PyPy'nin mobil cihazlarda çalışamayacağı anlamına gelir.

PyPy'nin avantajlarını ve sınırlamalarını gördüğümüze göre, şimdi PyPy'yi Ubuntu'da nasıl çalıştıracağımızı açıklayalım.

Ubuntu üzerinde PyPy çalıştırmak

PyPy'yi Mac, Linux veya Windows'ta çalıştırabilirsiniz, ancak biz Ubuntu'da çalıştırmayı ele alacağız. PyPy Linux ikili dosyalarının yalnızca belirli Linux dağıtımlarında desteklendiğini belirtmek önemlidir. Mevcut PyPy ikili dosyalarını ve desteklenen dağıtımlarını bu sayfada inceleyebilirsiniz. Örneğin, PyPy (veya Python 2.7 veya Python 3.6) yalnızca üç Ubuntu sürümü için desteklenmektedir: 18.04, 16.04 ve 14.04. Bu tarih itibariyle en son Ubuntu sürümüne (19.10) sahipseniz, PyPy'yi çalıştıramazsınız. Desteklenmeyen bir dağıtımda PyPy çalıştırmayı denemek şu hatayı verecektir:

PyPy ikili dosyaları sıkıştırılmış dosyalar olarak gelir. Tek yapmanız gereken indirdiğiniz dosyayı açmak. Sıkıştırılmamış klasörün içinde, PyPy çalıştırılabilir dosyasının bulunduğu "bin" adlı bir klasör vardır. Ben Python 3.6 kullanıyorum, bu nedenle dosya adı pypy3. Python 2.7 için ise sadece pypy olarak adlandırılıyor.

CPython için, terminalden Python 3 çalıştırmak istiyorsanız, `python3` komutunu girmeniz yeterlidir. PyPy'yi çalıştırmak için ise `pypy3` komutunu vermeniz yeterlidir.

Aşağıdaki şekilde gösterildiği gibi, terminale `pypy3` komutunu girdiğinizde 'pypy3' bulunamadı' mesajı alabilirsiniz. Bunun nedeni, PyPy yolunun PATH ortam değişkenine eklenmemiş olmasıdır. Terminaldeki geçerli yolun PyPy bin dizini içinde olması koşuluyla, aslında çalışan komut `./pypy3`'tür. Nokta (.) geçerli dizini ifade eder ve `/` işareti geçerli dizindeki bir şeye erişmek için eklenir. `./pypy3` komutunu vermek Python'u başarıyla çalıştırır.

Artık PyPy'nin avantajlarından yararlanarak Python ile her zamanki gibi çalışabilirsiniz. Örneğin, 1000 sayıyı toplayan basit bir Python betiği oluşturabilir ve bunu PyPy kullanarak çalıştırabiliriz. Kod şu şekildedir:.

nums = range(1000)
sum = 0
for k in nums:
sum = sum + k
print("Sum of 1,000 numbers is : ", sum)

Eğer bu betik test.py olarak adlandırılmışsa, aşağıdaki komutu kullanarak çalıştırabilirsiniz (Python dosyasının PyPy bin klasöründe bulunduğunu varsayarsak, bu konum pypy3 komutuyla aynıdır).

./pypy3 test.py

Bir sonraki şekil, önceki kodun yürütülmesinin sonucunu göstermektedir.

PyPy ve CPython çalışma zamanı karşılaştırması

1000 sayının toplamını hesaplamak için PyPy ve CPython'ın çalışma sürelerini karşılaştırmak amacıyla, süre ölçümü için kullanılan kod aşağıdaki gibi değişmektedir.

import time
t1 = time.time()
nums = range(1000)
sum = 0
for k in nums:
sum = sum + k
print("Sum of 1,000 numbers is : ", sum)
t2 = time.time()
t = t2 - t1
print("Elapsed time is : ", t, " seconds")

PyPy için süre 0,00045 saniyeye yakınken, CPython için bu süre 0,0002 saniyedir (kodu 2,5 GHz hızında çalışan Core i7-6500U işlemcili bilgisayarımda çalıştırdım). Bu durumda CPython, PyPy'den daha az zaman alıyor ki bu da beklenen bir durum çünkü bu gerçekten uzun süren bir işlem değil. Eğer kod 1000 yerine 1 milyon sayıyı toplayacak olsaydı, PyPy sonunda kazanırdı. Bu durumda PyPy için 0,00035 saniye, CPython için ise 0,1 saniye sürerdi. PyPy'nin avantajı artık açıkça ortada. Bu, CPython'un uzun süren işlemler için ne kadar daha yavaş olduğu konusunda size bir fikir vermelidir.

Sonuç

Bu eğitimde, en hızlı Python uygulaması olan PyPy tanıtılmaktadır. PyPy'nin en büyük avantajı, derlenmiş makine kodunu yeniden çalıştırılmasını önlemek için önbelleğe alan anlık derleme (JIT) özelliğidir. PyPy'nin sınırlamaları da vurgulanmaktadır; en önemlisi, saf Python kodu için iyi çalışması ancak C uzantıları için verimli olmamasıdır.

Ayrıca PyPy'nin Ubuntu'da nasıl çalıştığını gördük ve hem CPython hem de PyPy'nin yürütme sürelerini karşılaştırarak, uzun süren görevlerde PyPy'nin performansını vurguladık. Bununla birlikte, CPython kısa süren görevlerde PyPy'yi hala geride bırakabilir. Gelecek yazılarımızda PyPy, CPython ve Cython arasındaki karşılaştırmaları daha detaylı inceleyeceğiz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca Şunları da Beğenebilirsiniz